dsh-biocore 0.3.3 → 0.5.0

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 (59) hide show
  1. package/lib/index.js +30 -1
  2. package/lib/modules/standby.js +61 -0
  3. package/lib/modules/state.js +22 -3
  4. package/package.json +1 -1
  5. package/python/biocore_memory/core/config.py +7 -3
  6. package/python/biocore_memory/engine.py +91 -6
  7. package/python/biocore_memory/recall/embedding.py +0 -51
  8. package/python/biocore_memory/recall/feedback.py +34 -7
  9. package/python/biocore_memory/recall/fusion.py +5 -1
  10. package/python/biocore_memory/scoring.py +203 -0
  11. package/python/biocore_memory/space.py +355 -0
  12. package/python/biocore_memory/store/dedupe.py +1 -0
  13. package/python/biocore_memory/store/tiering.py +14 -3
  14. package/python/biocore_model/affective_labor.py +14 -1
  15. package/python/biocore_model/appraisal.py +172 -3
  16. package/python/biocore_model/bio_tick.py +43 -13
  17. package/python/biocore_model/emotion_geometry.py +9 -0
  18. package/python/biocore_model/envy.py +21 -0
  19. package/python/biocore_model/feedback_memory.py +53 -0
  20. package/python/biocore_model/needs_events.py +32 -11
  21. package/python/biocore_model/regulation_strategies.py +5 -0
  22. package/python/biocore_model/repair_after_boundary.py +1 -0
  23. package/python/biocore_model/self_esteem.py +14 -2
  24. package/python/biocore_model/self_intent.py +6 -4
  25. package/python/biocore_model/tests/test_autonomy_self.py +153 -153
  26. package/python/biocore_model/tests/test_cache_series.py +137 -0
  27. package/python/biocore_model/tests/test_core_state.py +240 -240
  28. package/python/biocore_model/tests/test_extensions.py +167 -167
  29. package/python/biocore_model/tests/test_field_arbiter.py +444 -0
  30. package/python/biocore_model/tests/test_governance.py +181 -181
  31. package/python/biocore_model/tests/test_lifecycle.py +153 -0
  32. package/python/biocore_model/tests/test_memory_inject.py +211 -211
  33. package/python/biocore_model/tests/test_retrieval_plus.py +143 -0
  34. package/python/biocore_model/tests/test_signals.py +106 -106
  35. package/python/biocore_model/tests/test_standby.py +199 -0
  36. package/python/biocore_runtime/__init__.py +3 -0
  37. package/python/biocore_runtime/arbiter.py +307 -0
  38. package/python/biocore_runtime/batch_b.py +724 -0
  39. package/python/biocore_runtime/batch_c.py +186 -0
  40. package/python/biocore_runtime/batch_d.py +659 -0
  41. package/python/biocore_runtime/batch_e.py +328 -0
  42. package/python/biocore_runtime/batch_registry.py +446 -0
  43. package/python/biocore_runtime/cache_stats.py +161 -0
  44. package/python/biocore_runtime/core_state.py +106 -3
  45. package/python/biocore_runtime/dimensions.py +419 -0
  46. package/python/biocore_runtime/expression.py +261 -0
  47. package/python/biocore_runtime/field.py +440 -0
  48. package/python/biocore_runtime/lifecycle.py +233 -0
  49. package/python/biocore_runtime/perception.py +1045 -0
  50. package/python/biocore_runtime/pipeline.py +4458 -2974
  51. package/python/biocore_runtime/priority.py +210 -0
  52. package/python/biocore_runtime/retrieval_plus.py +352 -0
  53. package/python/biocore_runtime/standby.py +581 -472
  54. package/python/biocore_runtime/timescales.py +263 -0
  55. package/python/data/signals.json +3266 -206
  56. package/ui/panel-layout.js +32 -29
  57. package/ui/panel.css +563 -974
  58. package/ui/panel.html +427 -401
  59. package/ui/panel.js +543 -450
package/ui/panel.html CHANGED
@@ -3,443 +3,467 @@
3
3
  <head>
4
4
  <meta charset="utf-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
6
- <meta name="color-scheme" content="light">
7
- <title>生物核 仪器面板</title>
8
- <link rel="stylesheet" href="panel.css?v=30">
6
+ <meta name="color-scheme" content="dark light">
7
+ <title>生物核 · 主管终端</title>
8
+ <link rel="icon" href="orb.png">
9
+ <script>
10
+ /* Theme before first paint: host <html data-theme> wins, then ?theme= preview,
11
+ otherwise CSS prefers-color-scheme decides. Keeps the switch flicker-free. */
12
+ (function () {
13
+ var root = document.documentElement
14
+ var query = new URLSearchParams(window.location.search)
15
+ var pinned = query.get('theme')
16
+ window.__bioThemePinned = pinned === 'light' || pinned === 'dark' ? pinned : ''
17
+ function hostTheme() {
18
+ try {
19
+ var doc = window.parent && window.parent !== window ? window.parent.document : null
20
+ var value = doc && doc.documentElement ? doc.documentElement.getAttribute('data-theme') : ''
21
+ return value === 'light' || value === 'dark' ? value : ''
22
+ } catch (error) { return '' }
23
+ }
24
+ window.__bioHostTheme = hostTheme
25
+ var theme = window.__bioThemePinned || hostTheme()
26
+ if (theme) root.setAttribute('data-theme', theme)
27
+ else root.removeAttribute('data-theme')
28
+ })()
29
+ </script>
30
+ <link rel="stylesheet" href="panel.css?v=32">
9
31
  </head>
10
- <body data-tab="dashboard" class="is-booting">
32
+ <body data-tab="dashboard">
11
33
  <svg class="sprite" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg">
12
- <symbol id="i-dashboard" viewBox="0 0 20 20"><rect x="3" y="3" width="6" height="6" rx="2"/><rect x="11" y="3" width="6" height="6" rx="2"/><rect x="3" y="11" width="6" height="6" rx="2"/><rect x="11" y="11" width="6" height="6" rx="2"/></symbol>
13
- <symbol id="i-memory" viewBox="0 0 20 20"><path d="M5 3.5h10v13l-5-3-5 3z"/></symbol>
14
- <symbol id="i-relation" viewBox="0 0 20 20"><path d="M10 16.2s-5.4-3.4-5.4-7a2.9 2.9 0 015.4-1.7 2.9 2.9 0 015.4 1.7c0 3.6-5.4 7-5.4 7z"/></symbol>
15
- <symbol id="i-settings" viewBox="0 0 20 20"><circle cx="10" cy="10" r="2.6"/><path d="M10 3.2v2M10 14.8v2M3.2 10h2M14.8 10h2M5.2 5.2l1.4 1.4M13.4 13.4l1.4 1.4M14.8 5.2l-1.4 1.4M6.6 13.4l-1.4 1.4"/></symbol>
16
- <symbol id="i-tools" viewBox="0 0 20 20"><path d="M11.6 4.4a3.2 3.2 0 00-3.9 3.9L3.6 12.4l2 2 4.1-4.1a3.2 3.2 0 003.9-3.9l-1.9 1.9-1.6-1.6 1.6-1.9z"/></symbol>
17
- <symbol id="i-mood" viewBox="0 0 20 20"><circle cx="10" cy="10" r="6.6"/><path d="M7 11.4c.8 1 1.8 1.5 3 1.5s2.2-.5 3-1.5"/></symbol>
18
- <symbol id="i-tension" viewBox="0 0 20 20"><path d="M3 10h3l2.2-4.6L11 15l2-5h4"/></symbol>
19
- <symbol id="i-chart" viewBox="0 0 20 20"><path d="M3 14.5l3.6-4.2 3 2.6L17 5"/><path d="M3 17h14"/></symbol>
20
- <symbol id="i-bars" viewBox="0 0 20 20"><path d="M3 6h14M3 10h14M3 14h9"/></symbol>
21
- <symbol id="i-today" viewBox="0 0 20 20"><rect x="3" y="4.5" width="14" height="12" rx="2.4"/><path d="M3 8.5h14M7 3v3M13 3v3"/></symbol>
22
- <symbol id="i-capacity" viewBox="0 0 20 20"><ellipse cx="10" cy="5.6" rx="6" ry="2.4"/><path d="M4 5.6v8.8c0 1.3 2.7 2.4 6 2.4s6-1.1 6-2.4V5.6"/><path d="M4 10c0 1.3 2.7 2.4 6 2.4s6-1.1 6-2.4"/></symbol>
23
- <symbol id="i-clock" viewBox="0 0 20 20"><circle cx="10" cy="10" r="6.6"/><path d="M10 6v4.2l2.6 1.6"/></symbol>
24
- <symbol id="i-route" viewBox="0 0 20 20"><circle cx="5.5" cy="5.5" r="2"/><circle cx="14.5" cy="14.5" r="2"/><path d="M7.5 5.5h4a3 3 0 013 3v4"/></symbol>
25
- <symbol id="i-cache" viewBox="0 0 20 20"><rect x="3" y="4" width="14" height="4.4" rx="2"/><rect x="3" y="11.6" width="14" height="4.4" rx="2"/></symbol>
26
- <symbol id="i-persona" viewBox="0 0 20 20"><circle cx="10" cy="6.8" r="2.9"/><path d="M4 15.6c1.2-2.6 3.4-4 6-4s4.8 1.4 6 4"/></symbol>
27
- <symbol id="i-model" viewBox="0 0 20 20"><rect x="3" y="4.4" width="14" height="11.2" rx="2.4"/><path d="M7.6 8.4l-2 1.8 2 1.8M12.4 8.4l2 1.8-2 1.8"/></symbol>
28
- <symbol id="i-switch" viewBox="0 0 20 20"><path d="M6.4 4.6h7.2a3.4 3.4 0 010 6.8H6.4a3.4 3.4 0 010-6.8z"/><circle cx="12.6" cy="8" r="1.4"/></symbol>
29
- <symbol id="i-expression" viewBox="0 0 20 20"><path d="M3.4 6h13M3.4 10h13M3.4 14h7.6"/></symbol>
30
- <symbol id="i-advanced" viewBox="0 0 20 20"><path d="M3.4 6h13M3.4 10h13M3.4 14h13"/><circle cx="7.4" cy="6" r="1.5"/><circle cx="12" cy="10" r="1.5"/><circle cx="6.4" cy="14" r="1.5"/></symbol>
34
+ <symbol id="i-dashboard" viewBox="0 0 24 24"><rect x="4" y="4" width="6" height="6"/><rect x="14" y="4" width="6" height="6"/><rect x="4" y="14" width="6" height="6"/><rect x="14" y="14" width="6" height="6"/></symbol>
35
+ <symbol id="i-memory" viewBox="0 0 24 24"><path d="M4 7h16M4 12h16M4 17h10"/><path d="M18 17h2"/></symbol>
36
+ <symbol id="i-relation" viewBox="0 0 24 24"><circle cx="8" cy="12" r="3"/><circle cx="17" cy="12" r="3"/><path d="M11 12h3"/></symbol>
37
+ <symbol id="i-settings" viewBox="0 0 24 24"><path d="M5 7h6M15 7h4M5 17h4M13 17h6"/><circle cx="12" cy="7" r="1.6"/><circle cx="10" cy="17" r="1.6"/></symbol>
38
+ <symbol id="i-tools" viewBox="0 0 24 24"><path d="M12 3l7 4.2v9.6L12 21l-7-4.2V7.2z"/><path d="M12 8v8"/></symbol>
31
39
  <symbol id="i-edit" viewBox="0 0 20 20"><path d="M13.4 3.6l3 3L7 16H4v-3z"/><path d="M11.4 5.6l3 3"/></symbol>
32
40
  <symbol id="i-check" viewBox="0 0 20 20"><path d="M4.4 10.4l3.6 3.6 7.6-8.4"/></symbol>
33
- <symbol id="i-rail" viewBox="0 0 20 20"><rect x="2.6" y="3.6" width="14.8" height="12.8" rx="3"/><path d="M7.6 3.6v12.8M12.6 8l-2 2 2 2"/></symbol>
34
- <symbol id="i-dot" viewBox="0 0 20 20"><circle cx="10" cy="10" r="4"/></symbol>
41
+ <symbol id="i-expand" viewBox="0 0 20 20"><path d="M4 8V4h4M16 12v4h-4"/><path d="M4 4l5 5M16 16l-5-5"/></symbol>
35
42
  </svg>
36
43
 
37
- <aside class="rail" id="rail" aria-label="主导航">
38
- <div class="rail-top">
39
- <span class="rail-mark" aria-hidden="true"><svg viewBox="0 0 20 20"><use href="#i-dot"></use></svg></span>
40
- <span class="rail-word">BioCore</span>
41
- <button class="rail-toggle" id="railToggle" type="button" aria-label="收起导航" aria-expanded="true" title="收起导航">
42
- <svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-rail"></use></svg>
44
+ <div class="shell">
45
+ <nav class="rail" aria-label="主导航">
46
+ <div class="rail-logo" aria-hidden="true">BC</div>
47
+ <button class="rail-item active" type="button" data-tab="dashboard" aria-selected="true" title="仪表盘" aria-label="仪表盘">
48
+ <svg class="ico" aria-hidden="true"><use href="#i-dashboard"></use></svg>
43
49
  </button>
44
- </div>
45
- <nav class="rail-nav" aria-label="页面导航">
46
- <button class="rail-item active" type="button" data-tab="dashboard" aria-selected="true" title="仪表盘"><svg class="ico" aria-hidden="true"><use href="#i-dashboard"></use></svg><span>仪表盘</span></button>
47
- <button class="rail-item" type="button" data-tab="memory" aria-selected="false" title="记忆"><svg class="ico" aria-hidden="true"><use href="#i-memory"></use></svg><span>记忆</span></button>
48
- <button class="rail-item" type="button" data-tab="relation" aria-selected="false" title="关系"><svg class="ico" aria-hidden="true"><use href="#i-relation"></use></svg><span>关系</span></button>
49
- <button class="rail-item" type="button" data-tab="settings" aria-selected="false" title="配置"><svg class="ico" aria-hidden="true"><use href="#i-settings"></use></svg><span>配置</span></button>
50
- <button class="rail-item" type="button" data-tab="tools" aria-selected="false" title="工具"><svg class="ico" aria-hidden="true"><use href="#i-tools"></use></svg><span>工具</span></button>
50
+ <button class="rail-item" type="button" data-tab="memory" aria-selected="false" title="记忆" aria-label="记忆">
51
+ <svg class="ico" aria-hidden="true"><use href="#i-memory"></use></svg>
52
+ </button>
53
+ <button class="rail-item" type="button" data-tab="relation" aria-selected="false" title="关系" aria-label="关系">
54
+ <svg class="ico" aria-hidden="true"><use href="#i-relation"></use></svg>
55
+ </button>
56
+ <button class="rail-item" type="button" data-tab="settings" aria-selected="false" title="配置" aria-label="配置">
57
+ <svg class="ico" aria-hidden="true"><use href="#i-settings"></use></svg>
58
+ </button>
59
+ <button class="rail-item" type="button" data-tab="tools" aria-selected="false" title="工具" aria-label="工具">
60
+ <svg class="ico" aria-hidden="true"><use href="#i-tools"></use></svg>
61
+ </button>
62
+ <div class="rail-foot"><span class="rail-ver" id="railVersion">v0.5.0</span></div>
51
63
  </nav>
52
- <div class="rail-foot"><span class="rail-version" id="railVersion">v0.2.1</span></div>
53
- </aside>
54
-
55
- <main class="panel" id="panel">
56
- <header class="topbar" id="topBar">
57
- <h1 id="pageTitle">仪表盘</h1>
58
- <nav class="seg" id="segTabs" aria-label="页面切换">
59
- <button class="seg-item active" type="button" data-tab="dashboard" aria-selected="true">仪表盘</button>
60
- <button class="seg-item" type="button" data-tab="memory" aria-selected="false">记忆</button>
61
- <button class="seg-item" type="button" data-tab="relation" aria-selected="false">关系</button>
62
- <button class="seg-item" type="button" data-tab="settings" aria-selected="false">配置</button>
63
- <button class="seg-item" type="button" data-tab="tools" aria-selected="false">工具</button>
64
- </nav>
65
- <div class="topbar-actions">
66
- <button id="layoutReset" class="ghost-button" type="button" hidden>恢复默认</button>
67
- <button id="layoutFab" class="icon-button" type="button" aria-label="编辑布局" title="编辑布局">
68
- <svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-edit"></use></svg>
69
- </button>
70
- <button id="layoutDone" class="icon-button icon-button-accent" type="button" aria-label="完成编辑" title="完成编辑" hidden>
71
- <svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-check"></use></svg>
72
- </button>
73
- </div>
74
- </header>
75
-
76
- <div class="grid" id="grid" aria-label="卡片网格">
77
64
 
78
- <section class="card status-card span-6 h-208" data-card-id="status" data-card-label="此刻">
79
- <div class="orb-wrap" aria-hidden="true">
80
- <div class="orb"><span class="orb-ring"></span></div>
65
+ <main class="main">
66
+ <header class="top" id="topBar">
67
+ <span class="brand">BIOCORE</span>
68
+ <span class="ttl" id="pageTitle">主管终端<em>OPERATOR TERMINAL</em></span>
69
+ <span class="chip" id="topChip">ONLINE</span>
70
+ <span class="chip" id="topBuild">BUILD 0.5.0</span>
71
+ <div class="top-right">
72
+ <span class="top-line"><i class="orb" id="orbState" aria-hidden="true"></i><span class="top-k">SESSION</span> <b class="num" id="topSession">—</b></span>
73
+ <span class="num" id="topClock">--:--:--</span>
74
+ <button id="layoutFab" class="icon-button" type="button" aria-label="编辑布局" title="编辑布局">
75
+ <svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-edit"></use></svg>
76
+ </button>
77
+ <button id="layoutDone" class="icon-button icon-button-accent" type="button" aria-label="完成编辑" title="完成编辑" hidden>
78
+ <svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-check"></use></svg>
79
+ </button>
80
+ <button id="layoutReset" class="chip chip-button" type="button" hidden>恢复默认</button>
81
81
  </div>
82
- <div class="status-body">
83
- <h2>她现在的样子</h2>
84
- <p class="motivation" id="motivation">正在读取…</p>
85
- <p class="status" id="status"><i class="dot"></i><span id="statusText">未连接</span></p>
86
- <p class="state-note" id="emptyHint" hidden></p>
87
- </div>
88
- <dl class="fact-list">
89
- <div><dt>语气</dt><dd id="toneWord">–</dd></div>
90
- <div><dt>关系</dt><dd id="relationWord">–</dd></div>
91
- <div><dt>自主</dt><dd id="autonomyWord">–</dd></div>
92
- </dl>
93
- </section>
94
-
95
- <section class="card metric-card span-3 h-208" data-card-id="mood" data-card-label="心情" title="心情指数范围 −1 到 1">
96
- <header class="card-head">
97
- <span class="card-ico"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-mood"></use></svg></span>
98
- <h2>心情</h2>
99
- <span class="card-trail" id="moodArrow">→</span>
100
- </header>
101
- <p class="metric"><strong id="moodValue">–</strong><span class="metric-word" id="moodWord">—</span></p>
102
- <p class="hint">指数范围 −1 到 1</p>
103
- <div class="subblock">
104
- <div class="data-row"><span>相对上一轮</span><b id="moodDelta">—</b></div>
105
- <div class="bar"><i id="moodBar"></i></div>
106
- </div>
107
- </section>
82
+ </header>
108
83
 
109
- <section class="card metric-card span-3 h-208" data-card-id="tension" data-card-label="张力" title="0.65 以上为阈值区">
110
- <header class="card-head">
111
- <span class="card-ico"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-tension"></use></svg></span>
112
- <h2>张力</h2>
113
- <span class="card-trail" id="tensionArrow">→</span>
114
- </header>
115
- <p class="metric"><strong id="tensionValue">–</strong><span class="metric-word" id="tensionWord">—</span></p>
116
- <p class="hint">0.65 以上为阈值区</p>
117
- <div class="subblock">
118
- <div class="data-row empty-hide"><span>相对上一轮</span><b id="tensionDelta">—</b></div>
119
- <div class="bar"><i id="tensionBar"></i><b class="bar-over" id="tensionOver"></b></div>
120
- </div>
121
- </section>
84
+ <div class="body" id="grid">
122
85
 
123
- <section class="card channel-card span-3 h-176" data-card-id="warmth" data-card-label="暖">
124
- <header class="card-head">
125
- <span class="card-ico"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-tension"></use></svg></span>
126
- <h2>暖</h2>
127
- <span class="card-trail" id="warmthArrow">→</span>
128
- </header>
129
- <p class="metric metric-sm"><strong id="warmthValue">–</strong><span class="metric-word" id="warmthStatus">—</span></p>
130
- <div class="data-row"><span>相对上一轮</span><b id="warmthDelta">—</b></div>
131
- <div class="subblock">
132
- <div class="bar"><i id="warmthBar"></i></div>
133
- <p class="hint" id="warmthNote">—</p>
134
- </div>
135
- </section>
86
+ <div class="stack">
87
+ <section class="card" data-card-id="intero" data-card-label="自体感知">
88
+ <header class="card-head">
89
+ <i class="sq" aria-hidden="true"></i>
90
+ <b>INTEROCEPTION</b><span class="zh">/ 自体感知</span>
91
+ <span class="r" id="interoMeta">—</span>
92
+ </header>
93
+ <div class="hero">
94
+ <div class="dial" aria-label="心情指数">
95
+ <svg viewBox="0 0 168 168" aria-hidden="true">
96
+ <circle class="dial-track" cx="84" cy="84" r="72"></circle>
97
+ <circle class="dial-dash" cx="84" cy="84" r="72"></circle>
98
+ <circle class="dial-arc" id="dialArc" cx="84" cy="84" r="72"></circle>
99
+ <circle class="dial-ring" cx="84" cy="84" r="82"></circle>
100
+ </svg>
101
+ <div class="dial-v">
102
+ <b class="num" id="dialValue">—</b>
103
+ <span id="dialLabel">—</span>
104
+ </div>
105
+ </div>
106
+ <div class="chan-col">
107
+ <div class="chans">
108
+ <div class="ch" aria-label="绷紧">
109
+ <span class="k">TENSION</span>
110
+ <span class="tr"><i id="tensionBar"></i><u class="tk"></u></span>
111
+ <span class="n num" id="tensionValue">—</span>
112
+ </div>
113
+ <div class="ch" aria-label="暖">
114
+ <span class="k">WARMTH</span>
115
+ <span class="tr"><i id="warmthBar"></i><u class="tk"></u></span>
116
+ <span class="n num" id="warmthValue">—</span>
117
+ </div>
118
+ <div class="ch" aria-label="沉">
119
+ <span class="k">WEIGHT</span>
120
+ <span class="tr"><i id="heavinessBar"></i><u class="tk"></u></span>
121
+ <span class="n num" id="heavinessValue">—</span>
122
+ </div>
123
+ <div class="ch" aria-label="清">
124
+ <span class="k">CLARITY</span>
125
+ <span class="tr"><i id="clarityBar"></i><u class="tk"></u></span>
126
+ <span class="n num" id="clarityValue">—</span>
127
+ </div>
128
+ </div>
129
+ <p class="note" id="interoNote">—</p>
130
+ </div>
131
+ </div>
132
+ </section>
136
133
 
137
- <section class="card channel-card span-3 h-176" data-card-id="heaviness" data-card-label="沉">
138
- <header class="card-head">
139
- <span class="card-ico"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-tension"></use></svg></span>
140
- <h2>沉</h2>
141
- <span class="card-trail" id="heavinessArrow">→</span>
142
- </header>
143
- <p class="metric metric-sm"><strong id="heavinessValue">–</strong><span class="metric-word" id="heavinessStatus">—</span></p>
144
- <div class="data-row"><span>相对上一轮</span><b id="heavinessDelta">—</b></div>
145
- <div class="subblock">
146
- <div class="bar"><i id="heavinessBar"></i></div>
147
- <p class="hint" id="heavinessNote">—</p>
134
+ <section class="card" data-card-id="log" data-card-label="记忆">
135
+ <header class="card-head">
136
+ <i class="sq" aria-hidden="true"></i>
137
+ <b>EPISODIC LOG</b><span class="zh">/ 记忆</span>
138
+ <span class="r" id="logMeta">—</span>
139
+ </header>
140
+ <table class="log-table">
141
+ <thead><tr><th>TIME</th><th>TYPE</th><th>CONTENT</th><th class="ta-r">W</th></tr></thead>
142
+ <tbody id="memoryList"><tr class="is-empty"><td colspan="4">—</td></tr></tbody>
143
+ </table>
144
+ </section>
148
145
  </div>
149
- </section>
150
146
 
151
- <section class="card channel-card span-3 h-176" data-card-id="clarity" data-card-label="清">
152
- <header class="card-head">
153
- <span class="card-ico"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-tension"></use></svg></span>
154
- <h2>清</h2>
155
- <span class="card-trail" id="clarityArrow">→</span>
156
- </header>
157
- <p class="metric metric-sm"><strong id="clarityValue">–</strong><span class="metric-word" id="clarityStatus">—</span></p>
158
- <div class="data-row"><span>相对上一轮</span><b id="clarityDelta">—</b></div>
159
- <div class="subblock">
160
- <div class="bar"><i id="clarityBar"></i></div>
161
- <p class="hint" id="clarityNote">—</p>
162
- </div>
163
- </section>
147
+ <div class="stack">
148
+ <section class="card" data-card-id="state" data-card-label="当前">
149
+ <header class="card-head">
150
+ <i class="sq" aria-hidden="true"></i>
151
+ <b>STATE</b><span class="zh">/ 当前</span>
152
+ <span class="r">READ ONLY</span>
153
+ </header>
154
+ <div class="kv" aria-label="关系"><span class="k">RELATION</span><span id="stateRelation">—</span></div>
155
+ <div class="kv" aria-label="语气"><span class="k">TONE</span><span id="stateTone">—</span></div>
156
+ <div class="kv" aria-label="自主"><span class="k">AUTONOMY</span><span id="stateAutonomy">—</span></div>
157
+ <div class="kv"><span class="k">INTENT</span><span class="num" id="stateIntent">—</span></div>
158
+ <div class="kv"><span class="k">SOCIAL PAIN</span><span class="num" id="statePain">—</span></div>
159
+ <p class="note" id="motivation">—</p>
160
+ <p class="state-note" id="emptyHint" hidden></p>
161
+ </section>
164
162
 
165
- <section class="card avg-card span-3 h-176" data-card-id="channels-avg" data-card-label="四通道均值">
166
- <header class="card-head">
167
- <span class="card-ico"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-bars"></use></svg></span>
168
- <h2>四通道均值</h2>
169
- <span class="card-trail" id="avgHint">—</span>
170
- </header>
171
- <dl class="data-list">
172
- <div><dt>绷紧</dt><dd id="avgTension">—</dd></div>
173
- <div><dt>暖</dt><dd id="avgWarmth">—</dd></div>
174
- <div><dt>沉</dt><dd id="avgHeaviness">—</dd></div>
175
- <div><dt>清</dt><dd id="avgClarity">—</dd></div>
176
- </dl>
177
- </section>
163
+ <section class="card" data-card-id="today" data-card-label="今日">
164
+ <header class="card-head">
165
+ <i class="sq" aria-hidden="true"></i>
166
+ <b>TODAY</b><span class="zh">/ 今日</span>
167
+ <span class="r">00:00 — NOW</span>
168
+ </header>
169
+ <div class="tiles">
170
+ <div class="tile"><div class="k">NEW MEMORY</div><div class="n num" id="todayMem">—</div></div>
171
+ <div class="tile"><div class="k">SAMPLES</div><div class="n num" id="todayTurns">—</div></div>
172
+ <div class="tile"><div class="k">PROACTIVE</div><div class="n num" id="todayProactive">—</div></div>
173
+ <div class="tile"><div class="k">CACHE HIT</div><div class="n num" id="todayCache">—</div></div>
174
+ </div>
175
+ </section>
178
176
 
179
- <section class="card chart-card span-8 h-232" data-card-id="chart" data-card-label="24 小时曲线">
180
- <header class="card-head">
181
- <span class="card-ico"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-chart"></use></svg></span>
182
- <h2>心情 24 小时</h2>
183
- <span class="card-trail" id="chartHint">—</span>
184
- </header>
185
- <div class="well chart-well">
186
- <canvas id="moodChart" height="150" aria-label="心情 24 小时曲线"></canvas>
187
- <p class="chart-empty" id="chartEmpty" hidden>还没有采样,聊过一轮之后这里会出现曲线</p>
177
+ <section class="card" data-card-id="loops" data-card-label="待办">
178
+ <header class="card-head">
179
+ <i class="sq" aria-hidden="true"></i>
180
+ <b>OPEN LOOPS</b><span class="zh">/ 待办</span>
181
+ <span class="r" id="loopsMeta">—</span>
182
+ </header>
183
+ <div class="kv"><span class="k">PROMISE</span><span id="loopPromise">—</span></div>
184
+ <div class="kv"><span class="k">UNANSWERED</span><span id="loopUnanswered">—</span></div>
185
+ <div class="kv"><span class="k">REPAIR</span><span id="loopRepair">—</span></div>
186
+ </section>
188
187
  </div>
189
- </section>
190
188
 
191
- <section class="card now-card span-4 h-232" data-card-id="expression-now" data-card-label="此刻的表达">
192
- <header class="card-head">
193
- <span class="card-ico"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-expression"></use></svg></span>
194
- <h2>此刻的表达</h2>
195
- <span class="card-trail" id="nowHint">只读</span>
196
- </header>
197
- <dl class="data-list">
198
- <div><dt>意图</dt><dd id="nowIntent">—</dd></div>
199
- <div><dt>长度因子</dt><dd id="nowLength">—</dd></div>
200
- <div><dt>主动性</dt><dd id="nowInitiative">—</dd></div>
201
- <div><dt>元认知带</dt><dd id="nowBand">—</dd></div>
202
- </dl>
203
- </section>
189
+ <div class="stack">
190
+ <section class="card" data-card-id="dims" data-card-label="维度">
191
+ <header class="card-head">
192
+ <i class="sq" aria-hidden="true"></i>
193
+ <b>DIMENSIONS</b><span class="zh">/ 维度</span>
194
+ <span class="r" id="dimsMeta">12 AXES</span>
195
+ </header>
196
+ <div class="kv-rows" id="dimsRows">
197
+ <div class="kv" data-dim="v"><span class="k">VALENCE</span><span class="num">—</span></div>
198
+ <div class="kv" data-dim="a"><span class="k">AROUSAL</span><span class="num">—</span></div>
199
+ <div class="kv" data-dim="dominance"><span class="k">DOMINANCE</span><span class="num">—</span></div>
200
+ <div class="kv" data-dim="stress"><span class="k">STRESS</span><span class="num">—</span></div>
201
+ <div class="kv" data-dim="social"><span class="k">SOCIAL</span><span class="num">—</span></div>
202
+ <div class="kv" data-dim="trust"><span class="k">TRUST</span><span class="num">—</span></div>
203
+ <div class="kv" data-dim="closeness"><span class="k">CLOSENESS</span><span class="num">—</span></div>
204
+ <div class="kv" data-dim="conflict"><span class="k">CONFLICT</span><span class="num">—</span></div>
205
+ <div class="kv" data-dim="needs.belonging"><span class="k">NEED BELONGING</span><span class="num">—</span></div>
206
+ <div class="kv" data-dim="needs.self_esteem"><span class="k">NEED ESTEEM</span><span class="num">—</span></div>
207
+ <div class="kv" data-dim="needs.control"><span class="k">NEED CONTROL</span><span class="num">—</span></div>
208
+ <div class="kv" data-dim="needs.meaningful_existence"><span class="k">NEED MEANING</span><span class="num">—</span></div>
209
+ </div>
210
+ </section>
204
211
 
205
- <section class="card today-card span-12 h-120" data-card-id="today" data-card-label="今日统计">
206
- <header class="card-head">
207
- <span class="card-ico"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-today"></use></svg></span>
208
- <h2>今日</h2>
209
- <span class="card-trail">本地时间 00:00 起</span>
210
- </header>
211
- <div class="triple">
212
- <div class="triple-col"><span>新增记忆</span><strong id="todayMem">—</strong></div>
213
- <div class="triple-col"><span>采样轮次</span><strong id="todayTurns">—</strong></div>
214
- <div class="triple-col"><span>主动发送</span><strong id="todayProactive">—</strong></div>
215
- </div>
216
- </section>
212
+ <section class="card" data-card-id="cache" data-card-label="缓存">
213
+ <header class="card-head">
214
+ <i class="sq" aria-hidden="true"></i>
215
+ <b>CACHE</b><span class="zh">/ 缓存</span>
216
+ <span class="r">30S</span>
217
+ </header>
218
+ <div class="kv"><span class="k">HIT RATE</span><span class="num" id="cacheStatText">—</span></div>
219
+ <div class="tr cache-tr"><i id="cacheBar"></i></div>
220
+ <div class="kv"><span class="k">CACHE_READ</span><span class="num" id="cacheDetail">—</span></div>
221
+ </section>
217
222
 
218
- <section class="card memory-card span-8 h-232" data-card-id="memory" data-card-label="最近记忆">
219
- <header class="card-head">
220
- <span class="card-ico"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-memory"></use></svg></span>
221
- <h2>最近记忆</h2>
222
- <span class="card-trail" id="memoryHint">共 0 条</span>
223
- </header>
224
- <div class="table-head"><span>时间</span><span>类型</span><span>内容</span></div>
225
- <div class="well list-well">
226
- <ul class="memory-list" id="memoryList"><li class="empty">还没有记忆,聊几句就会记住</li></ul>
223
+ <section class="card" data-card-id="system" data-card-label="系统">
224
+ <header class="card-head">
225
+ <i class="sq" aria-hidden="true"></i>
226
+ <b>SYSTEM</b><span class="zh">/ 系统</span>
227
+ <span class="r" id="systemMeta">—</span>
228
+ </header>
229
+ <div class="kv"><span class="k">ADAPTER</span><span class="num" id="sysAdapter">—</span></div>
230
+ <div class="kv"><span class="k">RECALL</span><span class="num" id="sysRecall">—</span></div>
231
+ <div class="kv"><span class="k">UPDATED</span><span class="num" id="sysUpdated">—</span></div>
232
+ <div class="kv"><span class="k">DEGRADED</span><span class="num" id="sysDegraded">—</span></div>
233
+ </section>
227
234
  </div>
228
- </section>
229
235
 
230
- <section class="card capacity-card span-4 h-232" data-card-id="memory-summary" data-card-label="记忆概览">
231
- <header class="card-head">
232
- <span class="card-ico"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-capacity"></use></svg></span>
233
- <h2>记忆概览</h2>
234
- <span class="card-trail" id="capText">0 / 200</span>
235
- </header>
236
- <div class="triple">
237
- <div class="triple-col"><span>共</span><strong id="memTotal">0</strong></div>
238
- <div class="triple-col"><span>今日新增</span><strong id="memToday">0</strong></div>
239
- <div class="triple-col"><span>召回次数</span><strong id="memRecall">—</strong></div>
240
- </div>
241
- <div class="subblock">
242
- <div class="data-row"><span>容量</span><b id="capFillText">0%</b></div>
243
- <div class="bar"><i id="capFill"></i></div>
244
- </div>
245
- </section>
236
+ <section class="strip" data-card-id="chart" data-card-label="24 小时">
237
+ <header class="card-head">
238
+ <i class="sq" aria-hidden="true"></i>
239
+ <b>MOOD TRACE</b><span class="zh">/ 24H</span>
240
+ <span class="r" id="chartHint">—</span>
241
+ </header>
242
+ <div class="hz">
243
+ <div class="hz-peak num"><span>PEAK</span><b id="peakValue">—</b></div>
244
+ <div class="hz-main">
245
+ <div class="tl" id="moodChart" role="img" aria-label="心情 24 小时"></div>
246
+ <div class="lb"><span>00</span><span>06</span><span>12</span><span>18</span><span>23</span></div>
247
+ </div>
248
+ </div>
249
+ <p class="chart-empty" id="chartEmpty" hidden>还没有采样</p>
250
+ </section>
246
251
 
247
- <section class="card relation-card span-6 h-176" data-card-id="metrics" data-card-label="关系数值">
248
- <header class="card-head">
249
- <span class="card-ico"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-relation"></use></svg></span>
250
- <h2>关系数值</h2>
251
- <span class="card-trail" id="relationHint">只读</span>
252
- </header>
253
- <div class="relation" id="metrics"></div>
254
- </section>
252
+ <section class="card" data-card-id="memory" data-card-label="最近记忆">
253
+ <header class="card-head">
254
+ <i class="sq" aria-hidden="true"></i>
255
+ <b>MEMORY</b><span class="zh">/ 最近记忆</span>
256
+ <span class="r" id="memoryHint">共 0 条</span>
257
+ </header>
258
+ <table class="log-table">
259
+ <thead><tr><th>TIME</th><th>TYPE</th><th>CONTENT</th><th class="ta-r">W</th></tr></thead>
260
+ <tbody id="memoryListFull"><tr class="is-empty"><td colspan="4">—</td></tr></tbody>
261
+ </table>
262
+ </section>
255
263
 
256
- <section class="card narrative-card span-6 h-176" data-card-id="narrative" data-card-label="叙事摘要">
257
- <header class="card-head">
258
- <span class="card-ico"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-expression"></use></svg></span>
259
- <h2>叙事摘要</h2>
260
- <span class="card-trail" id="narrativeHint">上一轮</span>
261
- </header>
262
- <dl class="data-list" id="narrative"></dl>
263
- </section>
264
+ <section class="card" data-card-id="memory-summary" data-card-label="记忆概览">
265
+ <header class="card-head">
266
+ <i class="sq" aria-hidden="true"></i>
267
+ <b>CAPACITY</b><span class="zh">/ 记忆概览</span>
268
+ <span class="r" id="capText">—</span>
269
+ </header>
270
+ <div class="triple">
271
+ <div class="triple-col"><span>共</span><strong class="num" id="memTotal">—</strong></div>
272
+ <div class="triple-col"><span>今日新增</span><strong class="num" id="memToday">—</strong></div>
273
+ <div class="triple-col"><span>召回次数</span><strong class="num" id="memRecall">—</strong></div>
274
+ </div>
275
+ <div class="subblock">
276
+ <div class="data-row"><span>容量</span><b class="num" id="capFillText">—</b></div>
277
+ <div class="tr"><i id="capFill"></i></div>
278
+ </div>
279
+ </section>
264
280
 
265
- <section class="card persona-card span-6 h-380" data-card-id="persona" data-card-label="人设">
266
- <header class="card-head">
267
- <span class="card-ico"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-persona"></use></svg></span>
268
- <h2>人设</h2>
269
- <span class="card-trail" id="personaStatus">读取中</span>
270
- </header>
271
- <label class="field field-block">
272
- <span>人设提示词</span>
273
- <textarea id="personaText" class="persona-text" rows="6" placeholder="性格、说话方式、在意什么"></textarea>
274
- </label>
275
- <div class="card-actions">
276
- <button id="personaSave" class="primary-button" type="button">保存并编译</button>
277
- <button id="personaPersist" class="ghost-button" type="button">设为常驻</button>
278
- <button id="personaRollback" class="ghost-button" type="button" hidden>恢复原人设</button>
279
- </div>
280
- <p class="hint" id="personaHint">编译只改倾向,不写记忆与安全策略</p>
281
- </section>
281
+ <section class="card" data-card-id="metrics" data-card-label="关系数值">
282
+ <header class="card-head">
283
+ <i class="sq" aria-hidden="true"></i>
284
+ <b>RELATION</b><span class="zh">/ 关系数值</span>
285
+ <span class="r" id="relationHint">只读</span>
286
+ </header>
287
+ <div class="relation" id="metrics"></div>
288
+ </section>
282
289
 
283
- <section class="card model-card span-6 h-380" data-card-id="model" data-card-label="模型与接口">
284
- <header class="card-head">
285
- <span class="card-ico"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-model"></use></svg></span>
286
- <h2>模型与接口</h2>
287
- <span class="card-trail" id="modelStatus">未保存</span>
288
- </header>
289
- <p class="group-title">Embedding 向量检索</p>
290
- <p class="hint">只用于记忆检索,与对话模型无关</p>
291
- <div class="field-grid">
292
- <label class="field"><span>模式</span>
293
- <select id="embeddingMode">
294
- <option value="auto">auto</option>
295
- <option value="remote">remote</option>
296
- <option value="local">local</option>
297
- <option value="off">off</option>
298
- </select>
299
- </label>
300
- <label class="field"><span>模型</span>
301
- <input id="modelName" type="text" placeholder="BAAI/bge-m3" autocomplete="off">
302
- </label>
303
- <label class="field field-wide"><span>Base URL</span>
304
- <input id="modelBaseUrl" type="url" placeholder="https://api.example.com/v1" autocomplete="off">
305
- </label>
306
- <label class="field field-wide"><span>API Key</span>
307
- <input id="modelApiKey" type="password" placeholder="留空表示沿用已保存的 Key" autocomplete="new-password">
308
- </label>
309
- </div>
310
- <p class="group-title">Rerank 召回精排</p>
311
- <label class="switch-row">
312
- <span class="switch-text">
313
- <span class="switch-label">启用重排</span>
314
- <span class="switch-desc">召回后用 rerank 精排</span>
315
- </span>
316
- <input id="rerankEnabled" type="checkbox">
317
- </label>
318
- <div class="field-grid" id="rerankFields">
319
- <label class="field"><span>模型</span>
320
- <input id="rerankModel" type="text" placeholder="jina-reranker-v2-base-multilingual" autocomplete="off">
321
- </label>
322
- <label class="field"><span>Top N</span>
323
- <input id="rerankTopN" type="number" min="1" max="100" value="20">
324
- </label>
325
- <label class="field"><span>Base URL</span>
326
- <input id="rerankBaseUrl" type="url" placeholder="https://api.example.com/v1" autocomplete="off">
290
+ <section class="card" data-card-id="narrative" data-card-label="叙事摘要">
291
+ <header class="card-head">
292
+ <i class="sq" aria-hidden="true"></i>
293
+ <b>NARRATIVE</b><span class="zh">/ 叙事摘要</span>
294
+ <span class="r" id="narrativeHint">上一轮</span>
295
+ </header>
296
+ <dl class="data-list" id="narrative"></dl>
297
+ </section>
298
+
299
+ <section class="card" data-card-id="persona" data-card-label="人设">
300
+ <header class="card-head">
301
+ <i class="sq" aria-hidden="true"></i>
302
+ <b>PERSONA</b><span class="zh">/ 人设</span>
303
+ <span class="r" id="personaStatus">读取中</span>
304
+ </header>
305
+ <label class="field field-block">
306
+ <span>人设提示词</span>
307
+ <textarea id="personaText" class="persona-text" rows="6" placeholder="性格、说话方式、在意什么"></textarea>
327
308
  </label>
328
- <label class="field"><span>API Key</span>
329
- <input id="rerankApiKey" type="password" placeholder="留空表示沿用已保存的 Key" autocomplete="new-password">
309
+ <div class="card-actions">
310
+ <button id="personaSave" class="primary-button" type="button">保存并编译</button>
311
+ <button id="personaPersist" class="ghost-button" type="button">设为常驻</button>
312
+ <button id="personaRollback" class="ghost-button" type="button" hidden>恢复原人设</button>
313
+ </div>
314
+ <p class="hint" id="personaHint">编译只改倾向,不写记忆与安全策略</p>
315
+ </section>
316
+
317
+ <section class="card" data-card-id="model" data-card-label="模型与接口">
318
+ <header class="card-head">
319
+ <i class="sq" aria-hidden="true"></i>
320
+ <b>MODEL</b><span class="zh">/ 模型与接口</span>
321
+ <span class="r" id="modelStatus">未保存</span>
322
+ </header>
323
+ <p class="group-title">Embedding 向量检索</p>
324
+ <p class="hint">只用于记忆检索,与对话模型无关</p>
325
+ <div class="field-grid">
326
+ <label class="field"><span>模式</span>
327
+ <select id="embeddingMode">
328
+ <option value="auto">auto</option>
329
+ <option value="remote">remote</option>
330
+ <option value="local">local</option>
331
+ <option value="off">off</option>
332
+ </select>
333
+ </label>
334
+ <label class="field"><span>模型</span>
335
+ <input id="modelName" type="text" placeholder="BAAI/bge-m3" autocomplete="off">
336
+ </label>
337
+ <label class="field field-wide"><span>Base URL</span>
338
+ <input id="modelBaseUrl" type="url" placeholder="https://api.example.com/v1" autocomplete="off">
339
+ </label>
340
+ <label class="field field-wide"><span>API Key</span>
341
+ <input id="modelApiKey" type="password" placeholder="留空表示沿用已保存的 Key" autocomplete="new-password">
342
+ </label>
343
+ </div>
344
+ <p class="group-title">Rerank 召回精排</p>
345
+ <label class="switch-row">
346
+ <span class="switch-text">
347
+ <span class="switch-label">启用重排</span>
348
+ <span class="switch-desc">召回后用 rerank 精排</span>
349
+ </span>
350
+ <input id="rerankEnabled" type="checkbox">
330
351
  </label>
331
- </div>
332
- <div class="card-actions">
333
- <button id="modelSave" class="primary-button" type="button">保存设置</button>
334
- <button id="modelTest" class="ghost-button" type="button">测试 Embedding</button>
335
- <button id="rerankTest" class="ghost-button" type="button">测试 Rerank</button>
336
- </div>
337
- </section>
352
+ <div class="field-grid" id="rerankFields">
353
+ <label class="field"><span>模型</span>
354
+ <input id="rerankModel" type="text" placeholder="jina-reranker-v2-base-multilingual" autocomplete="off">
355
+ </label>
356
+ <label class="field"><span>Top N</span>
357
+ <input id="rerankTopN" type="number" min="1" max="100" value="20">
358
+ </label>
359
+ <label class="field"><span>Base URL</span>
360
+ <input id="rerankBaseUrl" type="url" placeholder="https://api.jina.ai/v1" autocomplete="off">
361
+ </label>
362
+ <label class="field"><span>API Key</span>
363
+ <input id="rerankApiKey" type="password" placeholder="留空表示沿用已保存的 Key" autocomplete="new-password">
364
+ </label>
365
+ </div>
366
+ <div class="card-actions">
367
+ <button id="modelSave" class="primary-button" type="button">保存设置</button>
368
+ <button id="modelTest" class="ghost-button" type="button">测试 Embedding</button>
369
+ <button id="rerankTest" class="ghost-button" type="button">测试 Rerank</button>
370
+ </div>
371
+ </section>
338
372
 
339
- <section class="card switches-card span-8 h-420" data-card-id="switches" data-card-label="开关">
340
- <header class="card-head">
341
- <span class="card-ico"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-switch"></use></svg></span>
342
- <h2>开关</h2>
343
- <span class="card-trail" id="switchHint">写入宿主 flags</span>
344
- </header>
345
- <div class="switches" id="switches"></div>
346
- </section>
373
+ <section class="card" data-card-id="switches" data-card-label="开关">
374
+ <header class="card-head">
375
+ <i class="sq" aria-hidden="true"></i>
376
+ <b>SWITCHES</b><span class="zh">/ 开关</span>
377
+ <span class="r" id="switchHint">写入宿主 flags</span>
378
+ </header>
379
+ <div class="switches" id="switches"></div>
380
+ </section>
347
381
 
348
- <section class="card expression-card span-4 h-420" data-card-id="expression" data-card-label="表达">
349
- <header class="card-head">
350
- <span class="card-ico"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-expression"></use></svg></span>
351
- <h2>表达</h2>
352
- <span class="card-trail" id="expressionStatus">长度由人设决定</span>
353
- </header>
354
- <label class="switch-row">
355
- <span class="switch-text">
356
- <span class="switch-label">长度约束</span>
357
- <span class="switch-desc">按目标与上限字数约束表达</span>
358
- </span>
359
- <input id="expressionToggle" type="checkbox">
360
- </label>
361
- <div class="field-grid" id="expressionFields" hidden>
362
- <label class="field"><span>每句目标字数</span><input id="lengthTarget" type="number" min="1" max="200" value="10"></label>
363
- <label class="field"><span>上限字数</span><input id="lengthMax" type="number" min="2" max="400" value="30"></label>
364
- </div>
365
- <div class="card-actions">
366
- <button id="expressionSave" class="primary-button" type="button">保存表达</button>
367
- </div>
368
- </section>
369
-
370
- <section class="card advanced-card span-12 h-120" data-card-id="advanced" data-card-label="维护">
371
- <header class="card-head">
372
- <span class="card-ico"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-advanced"></use></svg></span>
373
- <h2>维护</h2>
374
- <span class="card-trail" id="advancedHint">只影响这台浏览器</span>
375
- </header>
376
- <div class="advanced-row">
377
- <div class="data-inline"><span>出口清洗</span><b id="sanitizeReplyText">开</b></div>
382
+ <section class="card" data-card-id="expression" data-card-label="表达">
383
+ <header class="card-head">
384
+ <i class="sq" aria-hidden="true"></i>
385
+ <b>EXPRESSION</b><span class="zh">/ 表达</span>
386
+ <span class="r" id="expressionStatus">长度由人设决定</span>
387
+ </header>
388
+ <label class="switch-row">
389
+ <span class="switch-text">
390
+ <span class="switch-label">长度约束</span>
391
+ <span class="switch-desc">按目标与上限字数约束表达</span>
392
+ </span>
393
+ <input id="expressionToggle" type="checkbox">
394
+ </label>
395
+ <div class="field-grid" id="expressionFields" hidden>
396
+ <label class="field"><span>每句目标字数</span><input id="lengthTarget" type="number" min="1" max="200" value="10"></label>
397
+ <label class="field"><span>上限字数</span><input id="lengthMax" type="number" min="2" max="400" value="30"></label>
398
+ </div>
378
399
  <div class="card-actions">
379
- <button id="resetLayout" class="ghost-button" type="button">恢复默认布局</button>
380
- <button id="clearDraft" class="ghost-button" type="button">清空本地草稿</button>
400
+ <button id="expressionSave" class="primary-button" type="button">保存表达</button>
381
401
  </div>
382
- </div>
383
- </section>
384
-
385
- <section class="card trace-card span-12 h-280" data-card-id="trace" data-card-label="这一轮为什么">
386
- <header class="card-head">
387
- <span class="card-ico"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-route"></use></svg></span>
388
- <h2>这一轮为什么</h2>
389
- <span class="card-trail" id="traceHint">最近 3 轮</span>
390
- </header>
391
- <div class="trace-head-row"><span>时间</span><span>状态变化</span><span>意图</span><span>长度来源</span><span>闸命中</span><span>记忆</span></div>
392
- <div class="well list-well">
393
- <div class="trace-list" id="traceList"><p class="state-note">还没有记录</p></div>
394
- </div>
395
- </section>
402
+ </section>
396
403
 
397
- <section class="card runtime-card span-4 h-200" data-card-id="runtime" data-card-label="运行时">
398
- <header class="card-head">
399
- <span class="card-ico"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-clock"></use></svg></span>
400
- <h2>运行时</h2>
401
- <span class="card-trail" id="runSession">会话 -</span>
402
- </header>
403
- <dl class="data-list">
404
- <div><dt>页面运行</dt><dd id="runtimeUptime">—</dd></div>
405
- <div><dt>采样点</dt><dd id="runtimeTurns">—</dd></div>
406
- <div><dt>向量模式</dt><dd id="runtimeVector">—</dd></div>
407
- <div><dt>状态刷新</dt><dd>5 <small>秒</small></dd></div>
408
- <div><dt>统计刷新</dt><dd>30 <small>秒</small></dd></div>
409
- </dl>
410
- </section>
404
+ <section class="card" data-card-id="advanced" data-card-label="维护">
405
+ <header class="card-head">
406
+ <i class="sq" aria-hidden="true"></i>
407
+ <b>SERVICE</b><span class="zh">/ 维护</span>
408
+ <span class="r" id="advancedHint">只影响这台浏览器</span>
409
+ </header>
410
+ <div class="advanced-row">
411
+ <div class="data-inline"><span>出口清洗</span><b id="sanitizeReplyText">—</b></div>
412
+ <div class="card-actions">
413
+ <button id="resetLayout" class="ghost-button" type="button">恢复默认布局</button>
414
+ <button id="clearDraft" class="ghost-button" type="button">清空本地草稿</button>
415
+ </div>
416
+ </div>
417
+ <p class="hint" id="dataDirText">数据目录:宿主托管</p>
418
+ </section>
411
419
 
412
- <section class="card diagnostics-card span-8 h-200" data-card-id="diagnostics" data-card-label="缓存与诊断">
413
- <header class="card-head">
414
- <span class="card-ico"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#i-cache"></use></svg></span>
415
- <h2>缓存与诊断</h2>
416
- <span class="card-trail">30 秒刷新</span>
417
- </header>
418
- <dl class="data-list data-list-inline">
419
- <div><dt>缓存命中</dt><dd id="cacheStatText">暂无数据</dd></div>
420
- <div><dt>cache_read / prompt</dt><dd id="cacheDetail">—</dd></div>
421
- <div><dt>会话</dt><dd id="diagSession">—</dd></div>
422
- <div><dt>数据目录</dt><dd id="dataDirText">宿主托管</dd></div>
423
- <div><dt>插件版本</dt><dd id="pluginVersion">0.2.1</dd></div>
424
- <div><dt>降级项</dt><dd id="diagDegraded">无</dd></div>
425
- <div><dt>状态生成</dt><dd id="diagGenerated">—</dd></div>
426
- <div><dt>适配器版本</dt><dd id="diagAdapter">—</dd></div>
427
- </dl>
428
- </section>
429
- </div>
420
+ <section class="card" data-card-id="trace" data-card-label="这一轮为什么">
421
+ <header class="card-head">
422
+ <i class="sq" aria-hidden="true"></i>
423
+ <b>TRACE</b><span class="zh">/ 这一轮为什么</span>
424
+ <span class="r" id="traceHint">最近 3 轮</span>
425
+ </header>
426
+ <div class="trace-head-row"><span>时间</span><span>状态变化</span><span>意图</span><span>长度来源</span><span>闸命中</span><span>记忆</span></div>
427
+ <div class="trace-list" id="traceList"><p class="state-note">还没有记录</p></div>
428
+ </section>
430
429
 
431
- <section class="add-cards" id="addCards" hidden>
432
- <h3>已隐藏的卡片</h3>
433
- <div class="add-list" id="addList"></div>
434
- </section>
430
+ <section class="card" data-card-id="runtime" data-card-label="运行时">
431
+ <header class="card-head">
432
+ <i class="sq" aria-hidden="true"></i>
433
+ <b>RUNTIME</b><span class="zh">/ 运行时</span>
434
+ <span class="r" id="runSession">—</span>
435
+ </header>
436
+ <dl class="data-list">
437
+ <div><dt>页面运行</dt><dd id="runtimeUptime">—</dd></div>
438
+ <div><dt>采样点</dt><dd class="num" id="runtimeTurns">—</dd></div>
439
+ <div><dt>向量模式</dt><dd id="runtimeVector">—</dd></div>
440
+ <div><dt>会话</dt><dd class="num" id="diagSession">—</dd></div>
441
+ <div><dt>状态刷新</dt><dd>5 <small>秒</small></dd></div>
442
+ <div><dt>统计刷新</dt><dd>30 <small>秒</small></dd></div>
443
+ </dl>
444
+ </section>
435
445
 
436
- <footer class="footer">
437
- <span id="footerMeta">会话 - 每 5 秒刷新</span>
438
- <span>只读投影</span>
439
- </footer>
446
+ <section class="card" data-card-id="diagnostics" data-card-label="诊断">
447
+ <header class="card-head">
448
+ <i class="sq" aria-hidden="true"></i>
449
+ <b>DIAGNOSTICS</b><span class="zh">/ 诊断</span>
450
+ <span class="r" id="diagHint">30 秒刷新</span>
451
+ </header>
452
+ <dl class="data-list data-list-inline">
453
+ <div><dt>状态生成</dt><dd class="num" id="diagGenerated">—</dd></div>
454
+ <div><dt>适配器版本</dt><dd class="num" id="diagAdapter">—</dd></div>
455
+ <div><dt>插件版本</dt><dd class="num" id="pluginVersion">—</dd></div>
456
+ <div><dt>降级项</dt><dd id="diagDegraded">—</dd></div>
457
+ </dl>
458
+ </section>
459
+ </div>
460
+ </main>
461
+ </div>
440
462
 
441
- <div class="layout-toast" id="layoutToast" role="status" hidden></div>
442
- </main>
463
+ <section class="add-cards" id="addCards" hidden>
464
+ <h3>已隐藏的卡片</h3>
465
+ <div class="add-list" id="addList"></div>
466
+ </section>
443
467
 
444
468
  <nav class="tabbar" id="tabBar" aria-label="页面切换">
445
469
  <button class="tab-item active" type="button" data-tab="dashboard" aria-selected="true">
@@ -459,8 +483,10 @@
459
483
  </button>
460
484
  </nav>
461
485
 
462
- <script src="panel-layout.js?v=8"></script>
486
+ <div class="layout-toast" id="layoutToast" role="status" hidden></div>
487
+
488
+ <script src="panel-layout.js?v=9"></script>
463
489
  <script src="trace-view.js?v=5"></script>
464
- <script src="panel.js?v=9"></script>
490
+ <script src="panel.js?v=11"></script>
465
491
  </body>
466
492
  </html>