dsh-biocore 0.2.0 → 0.3.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 (245) hide show
  1. package/README.md +11 -0
  2. package/lib/core-worker.js +268 -0
  3. package/lib/index.js +160 -70
  4. package/lib/modules/autonomy.js +125 -0
  5. package/lib/modules/cache-stats.js +48 -0
  6. package/lib/modules/core-turn.js +24 -6
  7. package/lib/modules/expression-inject.js +0 -10
  8. package/lib/modules/expression-refresh.js +0 -9
  9. package/lib/modules/memory-capture.js +2 -1
  10. package/lib/modules/memory-inject.js +50 -5
  11. package/lib/modules/memory-tools.js +7 -4
  12. package/lib/modules/python-env.js +46 -0
  13. package/lib/modules/safety-gate.js +0 -3
  14. package/lib/modules/series.js +54 -0
  15. package/lib/modules/switch.js +16 -0
  16. package/lib/py-bridge.js +81 -15
  17. package/package.json +1 -1
  18. package/python/biocore_memory/core/config.py +138 -127
  19. package/python/biocore_memory/engine.py +2653 -2476
  20. package/python/biocore_memory/recall/embedding.py +129 -0
  21. package/python/biocore_memory/recall/feedback.py +202 -0
  22. package/python/biocore_model/preference_drift.py +255 -0
  23. package/python/biocore_model/tests/__init__.py +1 -0
  24. package/python/biocore_model/tests/core_mode_ui_check.mjs +63 -0
  25. package/python/biocore_model/tests/core_status_check.mjs +29 -0
  26. package/python/biocore_model/tests/dom_safe_check.mjs +22 -0
  27. package/python/biocore_model/tests/leak_samples_run.py +18 -0
  28. package/python/biocore_model/tests/orb_ring_check.mjs +20 -0
  29. package/python/biocore_model/tests/panel_html_check.mjs +63 -0
  30. package/python/biocore_model/tests/persona_flow_check.mjs +17 -0
  31. package/python/biocore_model/tests/render_guard_check.mjs +19 -0
  32. package/python/biocore_model/tests/switch_groups_check.mjs +94 -0
  33. package/python/biocore_model/tests/tabs_state_check.mjs +24 -0
  34. package/python/biocore_model/tests/test_affective_labor.py +102 -0
  35. package/python/biocore_model/tests/test_appraisal.py +137 -0
  36. package/python/biocore_model/tests/test_appraisal_action.py +55 -0
  37. package/python/biocore_model/tests/test_arch_convergence.py +35 -0
  38. package/python/biocore_model/tests/test_attachment_behavior.py +95 -0
  39. package/python/biocore_model/tests/test_attachment_regulation.py +63 -0
  40. package/python/biocore_model/tests/test_attachment_state.py +29 -0
  41. package/python/biocore_model/tests/test_attribution.py +56 -0
  42. package/python/biocore_model/tests/test_attributor.py +108 -0
  43. package/python/biocore_model/tests/test_autonomic.py +69 -0
  44. package/python/biocore_model/tests/test_autonomy_accumulator.py +84 -0
  45. package/python/biocore_model/tests/test_autonomy_affect.py +62 -0
  46. package/python/biocore_model/tests/test_autonomy_blame.py +44 -0
  47. package/python/biocore_model/tests/test_autonomy_caps.py +29 -0
  48. package/python/biocore_model/tests/test_autonomy_check.py +40 -0
  49. package/python/biocore_model/tests/test_autonomy_clingy.py +41 -0
  50. package/python/biocore_model/tests/test_autonomy_cooldown_selfcontact.py +138 -0
  51. package/python/biocore_model/tests/test_autonomy_frustration.py +42 -0
  52. package/python/biocore_model/tests/test_autonomy_hourly_limit.py +46 -0
  53. package/python/biocore_model/tests/test_autonomy_loop.py +64 -0
  54. package/python/biocore_model/tests/test_autonomy_mode.py +37 -0
  55. package/python/biocore_model/tests/test_autonomy_model.py +60 -0
  56. package/python/biocore_model/tests/test_autonomy_model_v2.py +68 -0
  57. package/python/biocore_model/tests/test_autonomy_module_text.py +104 -0
  58. package/python/biocore_model/tests/test_autonomy_params.py +163 -0
  59. package/python/biocore_model/tests/test_autonomy_reason.py +34 -0
  60. package/python/biocore_model/tests/test_autonomy_self.py +153 -0
  61. package/python/biocore_model/tests/test_autonomy_send_gate.py +38 -0
  62. package/python/biocore_model/tests/test_autonomy_silence.py +37 -0
  63. package/python/biocore_model/tests/test_autonomy_status.py +35 -0
  64. package/python/biocore_model/tests/test_autonomy_test_trigger.py +24 -0
  65. package/python/biocore_model/tests/test_autonomy_tick.py +148 -0
  66. package/python/biocore_model/tests/test_autonomy_v4.py +64 -0
  67. package/python/biocore_model/tests/test_autonomy_v5.py +43 -0
  68. package/python/biocore_model/tests/test_autonomy_v7.py +48 -0
  69. package/python/biocore_model/tests/test_autonomy_v_theta.py +85 -0
  70. package/python/biocore_model/tests/test_batch1_wiring.py +231 -0
  71. package/python/biocore_model/tests/test_batch2_wiring.py +231 -0
  72. package/python/biocore_model/tests/test_batch3_wiring.py +223 -0
  73. package/python/biocore_model/tests/test_bio_tick.py +202 -0
  74. package/python/biocore_model/tests/test_boundary.py +183 -0
  75. package/python/biocore_model/tests/test_boundary_gate.py +295 -0
  76. package/python/biocore_model/tests/test_brain_split.py +99 -0
  77. package/python/biocore_model/tests/test_co_recall.py +350 -0
  78. package/python/biocore_model/tests/test_commitment_extractor.py +197 -0
  79. package/python/biocore_model/tests/test_compassion_fatigue.py +84 -0
  80. package/python/biocore_model/tests/test_connection_bids.py +69 -0
  81. package/python/biocore_model/tests/test_core_bridge.py +88 -0
  82. package/python/biocore_model/tests/test_core_bridge_episode.py +14 -0
  83. package/python/biocore_model/tests/test_core_bridge_forget.py +17 -0
  84. package/python/biocore_model/tests/test_core_bridge_identity.py +15 -0
  85. package/python/biocore_model/tests/test_core_bridge_media.py +17 -0
  86. package/python/biocore_model/tests/test_core_bridge_relation.py +17 -0
  87. package/python/biocore_model/tests/test_core_bridge_summary.py +17 -0
  88. package/python/biocore_model/tests/test_core_client.py +156 -0
  89. package/python/biocore_model/tests/test_core_commands.py +146 -0
  90. package/python/biocore_model/tests/test_core_mode.py +161 -0
  91. package/python/biocore_model/tests/test_core_state.py +240 -0
  92. package/python/biocore_model/tests/test_criticality.py +61 -0
  93. package/python/biocore_model/tests/test_cross_session_copy.py +67 -0
  94. package/python/biocore_model/tests/test_debug_values.py +169 -0
  95. package/python/biocore_model/tests/test_defense_mechanisms.py +177 -0
  96. package/python/biocore_model/tests/test_delta_budget.py +157 -0
  97. package/python/biocore_model/tests/test_diag_trace.py +201 -0
  98. package/python/biocore_model/tests/test_directives_compat.py +698 -0
  99. package/python/biocore_model/tests/test_dissonance.py +97 -0
  100. package/python/biocore_model/tests/test_drift_sign.py +87 -0
  101. package/python/biocore_model/tests/test_embedding_fallback.py +277 -0
  102. package/python/biocore_model/tests/test_embedding_local.py +279 -0
  103. package/python/biocore_model/tests/test_embedding_mode.py +175 -0
  104. package/python/biocore_model/tests/test_embedding_modes.py +342 -0
  105. package/python/biocore_model/tests/test_emotion_geometry.py +114 -0
  106. package/python/biocore_model/tests/test_emotion_probe.py +214 -0
  107. package/python/biocore_model/tests/test_emotion_probe_concurrency.py +128 -0
  108. package/python/biocore_model/tests/test_entity_graph.py +198 -0
  109. package/python/biocore_model/tests/test_entity_resolve.py +446 -0
  110. package/python/biocore_model/tests/test_envy.py +173 -0
  111. package/python/biocore_model/tests/test_exit_or_silence.py +209 -0
  112. package/python/biocore_model/tests/test_expr_guard.py +1 -0
  113. package/python/biocore_model/tests/test_expr_intent.py +66 -0
  114. package/python/biocore_model/tests/test_expr_state.py +66 -0
  115. package/python/biocore_model/tests/test_expr_template.py +71 -0
  116. package/python/biocore_model/tests/test_expr_tone.py +41 -0
  117. package/python/biocore_model/tests/test_extreme_scenarios.py +147 -0
  118. package/python/biocore_model/tests/test_feedback_flow.py +185 -0
  119. package/python/biocore_model/tests/test_feedback_guard.py +65 -0
  120. package/python/biocore_model/tests/test_feedback_llm.py +59 -0
  121. package/python/biocore_model/tests/test_feedback_llm_inferred.py +140 -0
  122. package/python/biocore_model/tests/test_feedback_memory.py +63 -0
  123. package/python/biocore_model/tests/test_feedback_user.py +61 -0
  124. package/python/biocore_model/tests/test_frustration_curve.py +66 -0
  125. package/python/biocore_model/tests/test_global_bio_state.py +116 -0
  126. package/python/biocore_model/tests/test_governance.py +181 -0
  127. package/python/biocore_model/tests/test_granularity.py +133 -0
  128. package/python/biocore_model/tests/test_graph_extract.py +224 -0
  129. package/python/biocore_model/tests/test_graph_recall.py +226 -0
  130. package/python/biocore_model/tests/test_graph_sqlite.py +298 -0
  131. package/python/biocore_model/tests/test_growth.py +301 -0
  132. package/python/biocore_model/tests/test_intent_render.py +60 -0
  133. package/python/biocore_model/tests/test_intero_regulation.py +224 -0
  134. package/python/biocore_model/tests/test_intero_style.py +146 -0
  135. package/python/biocore_model/tests/test_item3_numeric.py +105 -0
  136. package/python/biocore_model/tests/test_item6_numeric.py +116 -0
  137. package/python/biocore_model/tests/test_layered_memory.py +174 -0
  138. package/python/biocore_model/tests/test_leak_guard.py +75 -0
  139. package/python/biocore_model/tests/test_learning_probe.py +93 -0
  140. package/python/biocore_model/tests/test_life_loop.py +222 -0
  141. package/python/biocore_model/tests/test_life_loop_10s.py +131 -0
  142. package/python/biocore_model/tests/test_local_embedding_health.py +258 -0
  143. package/python/biocore_model/tests/test_memory_affect_encoding.py +79 -0
  144. package/python/biocore_model/tests/test_memory_backend.py +332 -0
  145. package/python/biocore_model/tests/test_memory_dedup.py +316 -0
  146. package/python/biocore_model/tests/test_memory_dual.py +219 -0
  147. package/python/biocore_model/tests/test_memory_dual_wiring.py +219 -0
  148. package/python/biocore_model/tests/test_memory_feedback.py +241 -0
  149. package/python/biocore_model/tests/test_memory_fixes.py +84 -0
  150. package/python/biocore_model/tests/test_memory_forgetting.py +58 -0
  151. package/python/biocore_model/tests/test_memory_inject.py +211 -0
  152. package/python/biocore_model/tests/test_memory_mood_recall.py +118 -0
  153. package/python/biocore_model/tests/test_memory_store.py +372 -0
  154. package/python/biocore_model/tests/test_metacog.py +103 -0
  155. package/python/biocore_model/tests/test_migrate.py +245 -0
  156. package/python/biocore_model/tests/test_migrate_store.py +194 -0
  157. package/python/biocore_model/tests/test_mind_wander.py +65 -0
  158. package/python/biocore_model/tests/test_mood.py +35 -0
  159. package/python/biocore_model/tests/test_narrative.py +114 -0
  160. package/python/biocore_model/tests/test_needs_esteem.py +51 -0
  161. package/python/biocore_model/tests/test_needs_events.py +205 -0
  162. package/python/biocore_model/tests/test_needs_sleep.py +54 -0
  163. package/python/biocore_model/tests/test_noise_bank.py +54 -0
  164. package/python/biocore_model/tests/test_numeric_schema.py +98 -0
  165. package/python/biocore_model/tests/test_output_protocol.py +65 -0
  166. package/python/biocore_model/tests/test_page_debug.py +147 -0
  167. package/python/biocore_model/tests/test_page_status_autonomy.py +215 -0
  168. package/python/biocore_model/tests/test_pipeline.py +345 -0
  169. package/python/biocore_model/tests/test_pipeline_api.py +192 -0
  170. package/python/biocore_model/tests/test_pipeline_mode.py +222 -0
  171. package/python/biocore_model/tests/test_plugin_config.py +85 -0
  172. package/python/biocore_model/tests/test_policy_learning.py +116 -0
  173. package/python/biocore_model/tests/test_possible_selves.py +88 -0
  174. package/python/biocore_model/tests/test_predictor.py +227 -0
  175. package/python/biocore_model/tests/test_preference_drift.py +142 -0
  176. package/python/biocore_model/tests/test_preset.py +142 -0
  177. package/python/biocore_model/tests/test_proactive_context.py +70 -0
  178. package/python/biocore_model/tests/test_proactive_history.py +90 -0
  179. package/python/biocore_model/tests/test_proactive_memory.py +141 -0
  180. package/python/biocore_model/tests/test_proactive_send_record.py +88 -0
  181. package/python/biocore_model/tests/test_probe_contract.py +71 -0
  182. package/python/biocore_model/tests/test_prospective.py +154 -0
  183. package/python/biocore_model/tests/test_provider_fallback.py +89 -0
  184. package/python/biocore_model/tests/test_reconstruction.py +111 -0
  185. package/python/biocore_model/tests/test_regulation_strategies.py +228 -0
  186. package/python/biocore_model/tests/test_relation_stage.py +114 -0
  187. package/python/biocore_model/tests/test_relationship_stage.py +59 -0
  188. package/python/biocore_model/tests/test_release_140.py +55 -0
  189. package/python/biocore_model/tests/test_repair_after_boundary.py +249 -0
  190. package/python/biocore_model/tests/test_reply_limit.py +86 -0
  191. package/python/biocore_model/tests/test_reply_limit_persist.py +48 -0
  192. package/python/biocore_model/tests/test_reply_split.py +52 -0
  193. package/python/biocore_model/tests/test_reply_split_astrbot.py +66 -0
  194. package/python/biocore_model/tests/test_reply_split_inject.py +53 -0
  195. package/python/biocore_model/tests/test_rerank.py +229 -0
  196. package/python/biocore_model/tests/test_rollback.py +175 -0
  197. package/python/biocore_model/tests/test_runtime.py +175 -0
  198. package/python/biocore_model/tests/test_runtime_active.py +205 -0
  199. package/python/biocore_model/tests/test_runtime_pipeline.py +1583 -0
  200. package/python/biocore_model/tests/test_runtime_proactive.py +231 -0
  201. package/python/biocore_model/tests/test_scheduler.py +79 -0
  202. package/python/biocore_model/tests/test_secrecy.py +105 -0
  203. package/python/biocore_model/tests/test_self_esteem.py +45 -0
  204. package/python/biocore_model/tests/test_self_intent.py +347 -0
  205. package/python/biocore_model/tests/test_self_interest.py +183 -0
  206. package/python/biocore_model/tests/test_self_layer_wiring.py +198 -0
  207. package/python/biocore_model/tests/test_self_verification.py +113 -0
  208. package/python/biocore_model/tests/test_situation.py +142 -0
  209. package/python/biocore_model/tests/test_sleep_circadian.py +41 -0
  210. package/python/biocore_model/tests/test_social_pain.py +49 -0
  211. package/python/biocore_model/tests/test_social_repair.py +67 -0
  212. package/python/biocore_model/tests/test_social_theory.py +78 -0
  213. package/python/biocore_model/tests/test_source_monitoring.py +204 -0
  214. package/python/biocore_model/tests/test_speak_like_group.py +36 -0
  215. package/python/biocore_model/tests/test_stages.py +226 -0
  216. package/python/biocore_model/tests/test_state_tag.py +86 -0
  217. package/python/biocore_model/tests/test_template_expr.py +65 -0
  218. package/python/biocore_model/tests/test_text_inference.py +70 -0
  219. package/python/biocore_model/tests/test_theta_params.py +115 -0
  220. package/python/biocore_model/tests/test_topic_control.py +200 -0
  221. package/python/biocore_model/tests/test_turn_memory.py +105 -0
  222. package/python/biocore_model/tests/test_turn_memory_panel.py +174 -0
  223. package/python/biocore_model/tests/test_ui_settings.py +84 -0
  224. package/python/biocore_model/tests/test_ui_settings_authority.py +179 -0
  225. package/python/biocore_model/tests/test_user_appraisal_async.py +155 -0
  226. package/python/biocore_model/tests/test_user_classify.py +122 -0
  227. package/python/biocore_model/tests/test_value_order.py +117 -0
  228. package/python/biocore_model/tests/test_voice_bank.py +105 -0
  229. package/python/biocore_model/tests/test_waiting_sense.py +216 -0
  230. package/python/biocore_model/tests/test_x_directives.py +101 -0
  231. package/python/biocore_model/tests/ui_compat_check.mjs +22 -0
  232. package/python/biocore_model/tests/view_mode_check.mjs +17 -0
  233. package/python/biocore_runtime/autonomy.py +208 -0
  234. package/python/biocore_runtime/core_state.py +302 -0
  235. package/python/biocore_runtime/governance.py +495 -0
  236. package/python/biocore_runtime/growth.py +528 -0
  237. package/python/biocore_runtime/pipeline.py +850 -23
  238. package/python/biocore_runtime/relationship_state.py +214 -0
  239. package/python/biocore_runtime/self_layer.py +103 -0
  240. package/python/biocore_runtime/service.py +162 -0
  241. package/python/biocore_runtime/standby.py +472 -0
  242. package/ui/panel-layout.js +83 -39
  243. package/ui/panel.css +885 -743
  244. package/ui/panel.html +356 -296
  245. package/ui/panel.js +739 -865
package/ui/panel.html CHANGED
@@ -1,277 +1,295 @@
1
1
  <!doctype html>
2
- <!-- BioCore panel layout v27: mobile = FlClash phone (masthead/channels 2x2/pill tabbar); desktop >=1024 = left rail + 12-col 5-row dashboard -->
3
2
  <html lang="zh-CN">
4
3
  <head>
5
4
  <meta charset="utf-8">
6
- <meta name="viewport" content="width=device-width, initial-scale=1">
7
- <title>生物核 · 仪器面板</title>
8
- <link rel="stylesheet" href="panel.css?v=27">
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">
9
9
  </head>
10
- <body>
10
+ <body data-tab="dashboard" class="is-booting">
11
+ <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>
31
+ <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
+ <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>
35
+ </svg>
36
+
11
37
  <aside class="rail" id="rail" aria-label="主导航">
12
- <button class="rail-toggle" id="railToggle" type="button" aria-label="收起导航" aria-expanded="true" title="收起导航">
13
- <svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="2.5" y="3.5" width="15" height="13" rx="2.5"/><path d="M7.5 3.5v13M12.5 8l-2 2 2 2"/></svg>
14
- </button>
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>
43
+ </button>
44
+ </div>
15
45
  <nav class="rail-nav" aria-label="页面导航">
16
- <button class="rail-item active" type="button" data-tab="dashboard" title="仪表盘" aria-selected="true"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="3" width="6" height="6" rx="1.5"/><rect x="11" y="3" width="6" height="6" rx="1.5"/><rect x="3" y="11" width="6" height="6" rx="1.5"/><rect x="11" y="11" width="6" height="6" rx="1.5"/></svg><span>仪表盘</span></button>
17
- <button class="rail-item" type="button" data-tab="memory" title="记忆" aria-selected="false"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 3.5h10v13l-5-3-5 3z"/></svg><span>记忆</span></button>
18
- <button class="rail-item" type="button" data-tab="relation" title="关系" aria-selected="false"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><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"/></svg><span>关系</span></button>
19
- <button class="rail-item" type="button" data-tab="settings" title="配置" aria-selected="false"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><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"/></svg><span>配置</span></button>
20
- <button class="rail-item" type="button" data-tab="tools" title="工具" aria-selected="false"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M11.6 4.4a3.2 3.2 0 00-4 4l-4.1 4.1 2 2 4.1-4.1a3.2 3.2 0 004-4l-2 2-1.6-1.6 1.6-2.4z"/></svg><span>工具</span></button>
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>
21
51
  </nav>
52
+ <div class="rail-foot"><span class="rail-version" id="railVersion">v0.2.1</span></div>
22
53
  </aside>
54
+
23
55
  <main class="panel" id="panel">
24
56
  <header class="topbar" id="topBar">
25
- <div class="topbar-title">
26
- <h1 id="pageTitle">BioCore</h1>
27
- <button id="layoutReset" class="link-button" type="button" hidden>恢复默认</button>
28
- </div>
29
- <button id="layoutFab" class="icon-button" type="button" aria-label="编辑仪表盘" title="编辑仪表盘">
30
- <svg viewBox="0 0 20 20" width="18" height="18" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M13.5 3.5l3 3L7 16H4v-3z"/><path d="M11.5 5.5l3 3"/></svg>
31
- </button>
32
- <button id="layoutDone" class="icon-button icon-button-accent" type="button" aria-label="完成编辑" title="完成编辑" hidden>
33
- <svg viewBox="0 0 20 20" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4.5 10.5l3.5 3.5 7-8"/></svg>
34
- </button>
35
- </header>
36
-
37
- <section class="desk" id="deskGrid" aria-label="桌面仪表盘">
38
- <header class="card desk-card desk-status">
39
- <div class="orb-wrap desk-orb" aria-hidden="true"><div class="orb"><span class="orb-ring"></span></div></div>
40
- <div class="desk-status-body">
41
- <h2>她现在的样子</h2>
42
- <p class="motivation" id="deskMotivation">正在读取…</p>
43
- <div class="status" id="deskStatus"><i class="dot"></i><span id="deskStatusText">未连接</span></div>
44
- </div>
45
- </header>
46
-
47
- <section class="card desk-card desk-metric" id="deskMoodCard" data-card-label="心情">
48
- <div class="desk-metric-head"><span>心情</span><span class="sub-trend"><b id="deskArrowV">→</b><span class="delta" id="deskDeltaV">—</span></span></div>
49
- <div class="desk-metric-value"><strong id="deskNumV">–</strong><span class="sub-status" id="deskWordV">—</span></div>
50
- <div class="bar"><i id="deskBarV"></i></div>
51
- </section>
52
-
53
- <section class="card desk-card desk-metric" id="deskTensionCard" data-card-label="张力">
54
- <div class="desk-metric-head"><span>张力</span><span class="sub-trend"><b id="deskArrowTension">→</b><span class="delta" id="deskDeltaTension">—</span></span></div>
55
- <div class="desk-metric-value"><strong id="deskNumTension">–</strong><span class="sub-status" id="deskWordTension">—</span></div>
56
- <div class="bar"><i id="deskBarTension"></i></div>
57
- </section>
58
-
59
- <nav class="card desk-card desk-seg" id="segTabs" aria-label="分组导航">
57
+ <h1 id="pageTitle">仪表盘</h1>
58
+ <nav class="seg" id="segTabs" aria-label="页面切换">
60
59
  <button class="seg-item active" type="button" data-tab="dashboard" aria-selected="true">仪表盘</button>
61
60
  <button class="seg-item" type="button" data-tab="memory" aria-selected="false">记忆</button>
62
61
  <button class="seg-item" type="button" data-tab="relation" aria-selected="false">关系</button>
63
62
  <button class="seg-item" type="button" data-tab="settings" aria-selected="false">配置</button>
64
63
  <button class="seg-item" type="button" data-tab="tools" aria-selected="false">工具</button>
65
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>
66
75
 
67
- <section class="card desk-card desk-switch" aria-label="安全闸">
68
- <span class="desk-switch-label">安全闸</span>
69
- <label class="desk-switch-control"><input type="checkbox" data-switch="safety_enabled" aria-label="安全闸"><span class="desk-switch-state" data-switch-state="safety_enabled">当前:关</span></label>
70
- </section>
71
-
72
- <section class="card desk-card desk-switch" aria-label="主动回复">
73
- <span class="desk-switch-label">主动回复</span>
74
- <label class="desk-switch-control"><input type="checkbox" data-switch="proactive_send" aria-label="主动回复"><span class="desk-switch-state" data-switch-state="proactive_send">当前:关</span></label>
75
- </section>
76
+ <div class="grid" id="grid" aria-label="卡片网格">
76
77
 
77
- <section class="card desk-card desk-tile">
78
- <div class="desk-tile-head"><span>数据目录</span><button class="desk-copy" id="deskCopyDataDir" type="button">复制</button></div>
79
- <strong id="deskDataDir">宿主托管</strong>
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>
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>
80
93
  </section>
81
94
 
82
- <section class="card desk-card desk-tile">
83
- <div class="desk-tile-head"><span>人设</span><span class="desk-chevron" aria-hidden="true">›</span></div>
84
- <strong id="deskPersona">未载入</strong>
85
- <span class="desk-tile-note" id="deskPersonaNote">—</span>
95
+ <section class="card metric-card span-3 h-208" data-card-id="mood" data-card-label="心情">
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>
86
107
  </section>
87
108
 
88
- <section class="card desk-card desk-tile">
89
- <div class="desk-tile-head"><span>运行时</span><span class="desk-chevron" aria-hidden="true">›</span></div>
90
- <div class="desk-tile-row"><span>运行时长</span><b id="deskUptime">—</b></div>
91
- <div class="desk-tile-row"><span>轮次</span><b id="deskTurns">—</b></div>
92
- <div class="desk-tile-row"><span>向量模式</span><b id="deskVector">—</b></div>
109
+ <section class="card metric-card span-3 h-208" data-card-id="tension" data-card-label="张力">
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>
93
121
  </section>
94
122
 
95
- <section class="card desk-card desk-tile">
96
- <div class="desk-tile-head"><span>记忆容量</span><span class="desk-tile-note" id="deskCapText">0 / 200</span></div>
97
- <div class="bar"><i id="deskCapFill"></i></div>
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>
98
135
  </section>
99
136
 
100
- <section class="card desk-card desk-memory">
101
- <div class="desk-card-head"><h2>最近记忆</h2><span class="card-aside" id="deskMemoryHint">—</span></div>
102
- <ul class="memory-list" id="deskMemoryList"><li class="empty">还没有记忆,聊几句就会记住</li></ul>
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>
148
+ </div>
103
149
  </section>
104
150
 
105
- <section class="card desk-card desk-chart">
106
- <div class="desk-card-head"><h2>心情 · 24 小时</h2><span class="card-aside" id="deskChartHint">单线 + 事件点</span></div>
107
- <canvas id="deskChart" height="170"></canvas>
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>
108
163
  </section>
109
164
 
110
- <section class="card desk-card desk-stat">
111
- <div class="desk-card-head"><h2>四通道均值</h2></div>
112
- <div class="desk-stat-row"><span>绷紧</span><b id="deskAvgTension">—</b></div>
113
- <div class="desk-stat-row"><span>暖</span><b id="deskAvgWarmth">—</b></div>
114
- <div class="desk-stat-row"><span>沉</span><b id="deskAvgHeaviness">—</b></div>
115
- <div class="desk-stat-row"><span>清</span><b id="deskAvgClarity">—</b></div>
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>
116
177
  </section>
117
178
 
118
- <section class="card desk-card desk-stat">
119
- <div class="desk-card-head"><h2>关系</h2></div>
120
- <div class="desk-stat-row"><span>亲近</span><b id="deskRelCloseness">—</b></div>
121
- <div class="desk-stat-row"><span>信任</span><b id="deskRelTrust">—</b></div>
122
- <div class="desk-stat-row"><span>冲突</span><b id="deskRelConflict">—</b></div>
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>
188
+ </div>
123
189
  </section>
124
190
 
125
- <section class="card desk-card desk-stat">
126
- <div class="desk-card-head"><h2>今日</h2></div>
127
- <div class="desk-stat-row"><span>新增记忆</span><b id="deskTodayMem">—</b></div>
128
- <div class="desk-stat-row"><span>轮次</span><b id="deskTodayTurns">—</b></div>
129
- <div class="desk-stat-row"><span>主动发送</span><b id="deskTodayProactive">—</b></div>
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>
130
203
  </section>
131
- </section>
132
-
133
- <header class="masthead" id="masthead">
134
- <div class="orb-wrap" aria-hidden="true">
135
- <div class="orb"><span class="orb-ring"></span></div>
136
- </div>
137
- <div class="identity">
138
- <h1>她现在的样子</h1>
139
- <p class="motivation" id="motivation">正在读取…</p>
140
- <div class="status" id="status"><i class="dot"></i><span id="statusText">未连接</span></div>
141
- <p class="empty-hint" id="emptyHint" hidden></p>
142
- </div>
143
- </header>
144
204
 
145
- <div class="cards" id="cards">
146
- <section class="card mood-card" data-card-id="mood" data-card-label="情绪">
147
- <div class="card-head">
148
- <span class="card-icon"><svg viewBox="0 0 18 18" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="9" cy="9" r="6.5"/><path d="M6 10.5c.8 1 1.8 1.5 3 1.5s2.2-.5 3-1.5"/></svg></span>
149
- <h2>情绪</h2>
150
- <span class="card-aside" id="moodAside">平稳</span>
151
- </div>
152
- <div class="sub-grid two">
153
- <div class="subblock">
154
- <div class="sub-label"><span>心情</span><span class="sub-trend"><b id="arrow-v">→</b><span class="delta" id="delta-v">—</span></span></div>
155
- <div class="sub-value"><strong id="num-v">–</strong></div>
156
- <div class="figure-caption">心情指数 −1 – 1</div>
157
- <div class="sub-note" id="moodNote">平稳</div>
158
- <div class="bar"><i id="bar-v"></i></div>
159
- </div>
160
- <div class="subblock">
161
- <div class="sub-label"><span>张力</span><span class="sub-trend"><b id="arrow-emotion-tension">→</b><span class="delta" id="delta-emotion-tension">—</span></span></div>
162
- <div class="sub-value"><strong id="num-emotion-tension">–</strong></div>
163
- <div class="sub-note" id="note-emotion-tension">—</div>
164
- <div class="bar"><i id="bar-emotion-tension"></i></div>
165
- </div>
166
- </div>
167
- <div class="chips">
168
- <span class="chip"><b>语气</b><strong id="word-tone">–</strong></span>
169
- <span class="chip"><b>关系</b><strong id="word-relation">–</strong></span>
170
- <span class="chip"><b>自主</b><strong id="word-autonomy">–</strong></span>
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>
171
215
  </div>
172
216
  </section>
173
217
 
174
- <div class="channels-wrap" data-layout-slot="channels">
175
- <div class="channel-title-row"><h2>四通道</h2><span class="channel-aside">2 × 2</span></div>
176
- <div class="channel-grid">
177
- <section class="card channel-card" data-card-id="tension" data-card-label="绷紧">
178
- <div class="channel-head"><span class="channel-label">绷紧</span><span class="sub-trend"><b id="arrow-tension">→</b><span class="delta" id="delta-tension">—</span></span></div>
179
- <div class="channel-value"><strong id="num-tension">–</strong><span class="sub-status" id="status-tension">—</span></div>
180
- <p class="sub-note" id="note-tension">—</p>
181
- <div class="bar stat-bar"><i id="bar-tension"></i><b class="bar-over" id="over-tension"></b></div>
182
- <div class="bar-legend"><span><i class="legend-dot"></i>当前</span><span><i class="legend-dot warn"></i>超阈值</span></div>
183
- </section>
184
- <section class="card channel-card" data-card-id="warmth" data-card-label="暖">
185
- <div class="channel-head"><span class="channel-label">暖</span><span class="sub-trend"><b id="arrow-warmth">→</b><span class="delta" id="delta-warmth">—</span></span></div>
186
- <div class="channel-value"><strong id="num-warmth">–</strong><span class="sub-status" id="status-warmth">—</span></div>
187
- <p class="sub-note" id="note-warmth">—</p>
188
- <div class="bar stat-bar"><i id="bar-warmth"></i><b class="bar-over" id="over-warmth"></b></div>
189
- <div class="bar-legend"><span><i class="legend-dot"></i>当前</span><span><i class="legend-dot warn"></i>超阈值</span></div>
190
- </section>
191
- <section class="card channel-card" data-card-id="heaviness" data-card-label="沉">
192
- <div class="channel-head"><span class="channel-label">沉</span><span class="sub-trend"><b id="arrow-heaviness">→</b><span class="delta" id="delta-heaviness">—</span></span></div>
193
- <div class="channel-value"><strong id="num-heaviness">–</strong><span class="sub-status" id="status-heaviness">—</span></div>
194
- <p class="sub-note" id="note-heaviness">—</p>
195
- <div class="bar stat-bar"><i id="bar-heaviness"></i><b class="bar-over" id="over-heaviness"></b></div>
196
- <div class="bar-legend"><span><i class="legend-dot"></i>当前</span><span><i class="legend-dot warn"></i>超阈值</span></div>
197
- </section>
198
- <section class="card channel-card" data-card-id="clarity" data-card-label="清">
199
- <div class="channel-head"><span class="channel-label">清</span><span class="sub-trend"><b id="arrow-clarity">→</b><span class="delta" id="delta-clarity">—</span></span></div>
200
- <div class="channel-value"><strong id="num-clarity">–</strong><span class="sub-status" id="status-clarity">—</span></div>
201
- <p class="sub-note" id="note-clarity">—</p>
202
- <div class="bar stat-bar"><i id="bar-clarity"></i><b class="bar-over" id="over-clarity"></b></div>
203
- <div class="bar-legend"><span><i class="legend-dot"></i>当前</span><span><i class="legend-dot warn"></i>超阈值</span></div>
204
- </section>
205
- </div>
206
- </div>
207
-
208
- <section class="card chart-card" data-card-id="chart" data-card-label="心情曲线">
209
- <div class="card-head">
210
- <span class="card-icon"><svg viewBox="0 0 18 18" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 13l3.5-4 3 2.5L15 5"/><path d="M3 15h12"/></svg></span>
211
- <h2>心情 · 24 小时</h2>
212
- <span class="card-aside" id="chartHint">单线 + 事件点</span>
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>
213
227
  </div>
214
- <canvas id="moodChart" height="170"></canvas>
215
- </section>
216
-
217
- <section class="card memory-card" data-card-id="memory" data-card-label="最近记忆">
218
- <div class="section-head"><span class="card-icon"><svg viewBox="0 0 18 18" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 3.5h8v11l-4-2.5-4 2.5z"/></svg></span><h2>最近记忆</h2><span class="hint" id="memoryHint">共 0 条</span></div>
219
- <ul class="memory-list" id="memoryList"><li class="empty">还没有记忆,聊几句就会记住</li></ul>
220
228
  </section>
221
229
 
222
- <section class="card memory-summary-card" data-card-id="memory-summary" data-card-label="记忆概览">
223
- <div class="section-head"><span class="card-icon"><svg viewBox="0 0 18 18" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 5h12M3 9h12M3 13h8"/></svg></span><h2>记忆概览</h2><span class="hint">本地记忆库</span></div>
224
- <div class="memory-stats">
225
- <div class="memory-stat"><span>共</span><strong id="memTotal">0</strong><em>条</em></div>
226
- <div class="memory-stat"><span>今日新增</span><strong id="memToday">0</strong><em>条</em></div>
227
- <div class="memory-stat"><span>召回次数</span><strong id="memRecall">—</strong><em>次</em></div>
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>
228
240
  </div>
229
- <div class="capacity">
230
- <div class="bar capacity-bar"><i id="capFill"></i></div>
231
- <div class="bar-legend"><span><i class="legend-dot fill"></i>容量</span><span id="capText">0 / 200</span></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>
232
244
  </div>
233
245
  </section>
234
246
 
235
- <section class="card metrics-card relation-card" data-card-id="metrics" data-card-label="关系与叙事">
236
- <div class="section-head"><span class="card-icon"><svg viewBox="0 0 18 18" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="6.5" cy="9" r="2.5"/><circle cx="12.5" cy="9" r="2.5"/></svg></span><h2>关系与叙事</h2><span class="hint">数字</span></div>
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>
237
253
  <div class="relation" id="metrics"></div>
238
254
  </section>
239
255
 
240
- <details class="card trace-card" id="traceCard" data-card-id="trace" data-card-label="这一轮为什么">
241
- <summary class="trace-summary">
242
- <h2>这一轮为什么</h2>
243
- <span class="hint" id="traceHint">最近 3 轮</span>
244
- </summary>
245
- <div class="trace-list" id="traceList"><p class="empty">还没有记录</p></div>
246
- </details>
247
-
248
- <section class="card runtime-card" data-card-id="runtime" data-card-label="运行时">
249
- <div class="section-head"><span class="card-icon"><svg viewBox="0 0 18 18" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="9" cy="9" r="6.5"/><path d="M9 5v4l2.5 1.5"/></svg></span><h2>运行时</h2><span class="hint">只读</span></div>
250
- <div class="triple">
251
- <div class="triple-col"><strong id="runtimeUptime">—</strong><span>运行时长</span></div>
252
- <div class="triple-col"><strong id="runtimeTurns">—</strong><span>轮次数</span></div>
253
- <div class="triple-col"><strong id="runtimeVector">—</strong><span>向量模式</span></div>
254
- </div>
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>
255
263
  </section>
256
264
 
257
- <section class="card persona-card" data-card-id="persona" data-card-label="人设">
258
- <div class="section-head"><span class="card-icon"><svg viewBox="0 0 18 18" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="9" cy="6.5" r="2.8"/><path d="M3.5 15c1.2-2.6 3.2-4 5.5-4s4.3 1.4 5.5 4"/></svg></span><h2>人设</h2><span class="hint" id="personaStatus">读取中…</span></div>
259
- <textarea id="personaText" class="persona-text" rows="5" placeholder="写下她的人设提示词:性格、说话方式、在意什么……"></textarea>
260
- <div class="persona-actions">
261
- <button id="personaSave" class="persona-save" type="button">保存并编译</button>
262
- <button id="personaPersist" class="persona-save" type="button">设为常驻模式</button>
263
- <button id="personaRollback" class="persona-save" type="button" hidden>恢复原人设</button>
264
- <span class="hint" id="personaHint">编译只改倾向,不写记忆 / 事实 / 安全策略</span>
265
- <span class="hint" id="personaPersistHint">常驻:未应用</span>
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>
266
279
  </div>
267
- <div class="persona-preview" id="personaPreview"></div>
280
+ <p class="hint" id="personaHint">编译只改倾向,不写记忆与安全策略</p>
268
281
  </section>
269
282
 
270
- <section class="card model-card" data-card-id="model" data-card-label="模型与接口">
271
- <div class="section-head"><span class="card-icon"><svg viewBox="0 0 18 18" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="4" width="12" height="10" rx="2.5"/><path d="M7 8l-2 1.5 2 1.5M11 8l2 1.5-2 1.5"/></svg></span><h2>模型与接口</h2><span class="hint" id="modelStatus">未保存</span></div>
272
- <div class="model-section-title">Embedding</div>
273
- <div class="model-grid">
274
- <label class="field"><span>Embedding 模式</span>
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>
275
293
  <select id="embeddingMode">
276
294
  <option value="auto">auto</option>
277
295
  <option value="remote">remote</option>
@@ -279,128 +297,170 @@
279
297
  <option value="off">off</option>
280
298
  </select>
281
299
  </label>
282
- <label class="field"><span>Base URL</span>
283
- <input id="modelBaseUrl" type="url" placeholder="https://api.deepseek.com" autocomplete="off">
284
- </label>
285
300
  <label class="field"><span>模型</span>
286
- <input id="modelName" type="text" placeholder="deepseek-flash" autocomplete="off">
301
+ <input id="modelName" type="text" placeholder="BAAI/bge-m3" autocomplete="off">
287
302
  </label>
288
- <label class="field"><span>API Key</span>
289
- <input id="modelApiKey" type="password" placeholder="••••••••" autocomplete="new-password">
303
+ <label class="field field-wide"><span>Base URL</span>
304
+ <input id="modelBaseUrl" type="url" placeholder="https://api.example.com/v1" autocomplete="off">
290
305
  </label>
291
- <label class="field"><span>本地模型路径</span>
292
- <input id="modelLocalPath" type="text" placeholder="C:\models\bge-m3" autocomplete="off">
306
+ <label class="field field-wide"><span>API Key</span>
307
+ <input id="modelApiKey" type="password" placeholder="留空表示沿用已保存的 Key" autocomplete="new-password">
293
308
  </label>
294
309
  </div>
295
- <div class="model-section-title">Rerank</div>
296
- <label class="switch-row rerank-toggle">
310
+ <p class="group-title">Rerank 召回精排</p>
311
+ <label class="switch-row">
297
312
  <span class="switch-text">
298
313
  <span class="switch-label">启用重排</span>
299
- <span class="switch-desc">召回后用 rerank 精排结果</span>
314
+ <span class="switch-desc">召回后用 rerank 精排</span>
300
315
  </span>
301
316
  <input id="rerankEnabled" type="checkbox">
302
317
  </label>
303
- <div class="model-grid rerank-grid" id="rerankFields">
304
- <label class="field"><span>Rerank Base URL</span>
305
- <input id="rerankBaseUrl" type="url" placeholder="https://api.jina.ai/v1" autocomplete="off">
306
- </label>
307
- <label class="field"><span>Rerank 模型</span>
318
+ <div class="field-grid" id="rerankFields">
319
+ <label class="field"><span>模型</span>
308
320
  <input id="rerankModel" type="text" placeholder="jina-reranker-v2-base-multilingual" autocomplete="off">
309
321
  </label>
310
- <label class="field"><span>Rerank API Key</span>
311
- <input id="rerankApiKey" type="password" placeholder="••••••••" autocomplete="new-password">
312
- </label>
313
322
  <label class="field"><span>Top N</span>
314
323
  <input id="rerankTopN" type="number" min="1" max="100" value="20">
315
324
  </label>
325
+ <label class="field"><span>Base URL</span>
326
+ <input id="rerankBaseUrl" type="url" placeholder="https://api.example.com/v1" autocomplete="off">
327
+ </label>
328
+ <label class="field"><span>API Key</span>
329
+ <input id="rerankApiKey" type="password" placeholder="留空表示沿用已保存的 Key" autocomplete="new-password">
330
+ </label>
316
331
  </div>
317
- <div class="model-actions">
318
- <button id="modelSave" type="button" class="persona-save">保存设置</button>
319
- <button id="modelTest" type="button" class="model-test">测试 Embedding</button>
320
- <button id="rerankTest" type="button" class="model-test">测试 Rerank</button>
321
- <span class="hint" id="modelHint">保存后写入配置,重启 BioCore 生效</span>
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>
322
336
  </div>
323
337
  </section>
324
338
 
325
- <section class="card switches-card" data-card-id="switches" data-card-label="开关">
326
- <div class="section-head"><span class="card-icon"><svg viewBox="0 0 18 18" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 4h6a4 4 0 010 8H6a4 4 0 010-8z"/><circle cx="12" cy="8" r="1.6"/></svg></span><h2>开关</h2><span class="hint" id="switchHint">只写宿主设置</span></div>
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>
327
345
  <div class="switches" id="switches"></div>
328
346
  </section>
329
347
 
330
- <section class="card expression-card" data-card-id="expression" data-card-label="表达">
331
- <div class="section-head">
332
- <span class="card-icon"><svg viewBox="0 0 18 18" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 5h12M3 9h12M3 13h8"/></svg></span>
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>
333
351
  <h2>表达</h2>
334
- <span class="hint" id="expressionStatus">长度由人设决定</span>
335
- </div>
336
- <label class="switch-row expression-toggle">
352
+ <span class="card-trail" id="expressionStatus">长度由人设决定</span>
353
+ </header>
354
+ <label class="switch-row">
337
355
  <span class="switch-text">
338
356
  <span class="switch-label">长度约束</span>
339
- <span class="switch-desc">打开后按目标/上限字数约束表达</span>
357
+ <span class="switch-desc">按目标与上限字数约束表达</span>
340
358
  </span>
341
359
  <input id="expressionToggle" type="checkbox">
342
360
  </label>
343
- <div class="expression-fields" id="expressionFields" hidden>
361
+ <div class="field-grid" id="expressionFields" hidden>
344
362
  <label class="field"><span>每句目标字数</span><input id="lengthTarget" type="number" min="1" max="200" value="10"></label>
345
363
  <label class="field"><span>上限字数</span><input id="lengthMax" type="number" min="2" max="400" value="30"></label>
346
364
  </div>
347
- <div class="model-actions">
348
- <button id="expressionSave" class="persona-save" type="button">保存表达</button>
349
- <span class="hint" id="expressionHint">关闭时长度由人设决定</span>
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>
378
+ <div class="card-actions">
379
+ <button id="resetLayout" class="ghost-button" type="button">恢复默认布局</button>
380
+ <button id="clearDraft" class="ghost-button" type="button">清空本地草稿</button>
381
+ </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>
350
394
  </div>
351
395
  </section>
352
396
 
353
- <section class="card advanced-card" data-card-id="advanced" data-card-label="高级">
354
- <div class="section-head"><span class="card-icon"><svg viewBox="0 0 18 18" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 5h12M3 9h12M3 13h12"/><circle cx="7" cy="5" r="1.3"/><circle cx="11" cy="9" r="1.3"/><circle cx="6" cy="13" r="1.3"/></svg></span><h2>高级</h2><span class="hint" id="advancedHint">本地设置</span></div>
355
- <dl class="advanced-info">
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>
411
+
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>
356
422
  <div><dt>数据目录</dt><dd id="dataDirText">宿主托管</dd></div>
357
- <div><dt>插件版本</dt><dd id="pluginVersion">0.1.0</dd></div>
358
- <div><dt>出口清洗</dt><dd id="sanitizeReplyText">开</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>
359
427
  </dl>
360
- <div class="advanced-actions">
361
- <button id="resetLayout" class="advanced-button" type="button">恢复默认布局</button>
362
- <button id="clearDraft" class="advanced-button" type="button">清空本地草稿</button>
363
- </div>
364
428
  </section>
365
429
  </div>
366
430
 
367
431
  <section class="add-cards" id="addCards" hidden>
368
- <h3>添加卡片</h3>
432
+ <h3>已隐藏的卡片</h3>
369
433
  <div class="add-list" id="addList"></div>
370
434
  </section>
371
435
 
372
- <nav class="tabbar" id="tabBar" aria-label="分组导航">
373
- <button class="tab-item active" type="button" data-tab="dashboard" aria-selected="true">
374
- <svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="3" width="6" height="6" rx="1.5"/><rect x="11" y="3" width="6" height="6" rx="1.5"/><rect x="3" y="11" width="6" height="6" rx="1.5"/><rect x="11" y="11" width="6" height="6" rx="1.5"/></svg>
375
- <span>仪表盘</span>
376
- </button>
377
- <button class="tab-item" type="button" data-tab="memory" aria-selected="false">
378
- <svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 3.5h10v13l-5-3-5 3z"/></svg>
379
- <span>记忆</span>
380
- </button>
381
- <button class="tab-item" type="button" data-tab="relation" aria-selected="false">
382
- <svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><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"/></svg>
383
- <span>关系</span>
384
- </button>
385
- <button class="tab-item" type="button" data-tab="settings" aria-selected="false">
386
- <svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><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"/></svg>
387
- <span>配置</span>
388
- </button>
389
- <button class="tab-item" type="button" data-tab="tools" aria-selected="false">
390
- <svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M11.6 4.4a3.2 3.2 0 00-4 4l-4.1 4.1 2 2 4.1-4.1a3.2 3.2 0 004-4l-2 2-1.6-1.6 1.6-2.4z"/></svg>
391
- <span>工具</span>
392
- </button>
393
- </nav>
394
-
395
- <div class="layout-toast" id="layoutToast" role="status" hidden></div>
396
-
397
436
  <footer class="footer">
398
- <span id="footerMeta">会话 - · 每 2 秒刷新</span>
399
- <span>BioCore · 只读投影</span>
437
+ <span id="footerMeta">会话 - 每 5 秒刷新</span>
438
+ <span>只读投影</span>
400
439
  </footer>
440
+
441
+ <div class="layout-toast" id="layoutToast" role="status" hidden></div>
401
442
  </main>
402
- <script src="panel-layout.js?v=5"></script>
443
+
444
+ <nav class="tabbar" id="tabBar" aria-label="页面切换">
445
+ <button class="tab-item active" type="button" data-tab="dashboard" aria-selected="true">
446
+ <svg class="ico" aria-hidden="true"><use href="#i-dashboard"></use></svg><span>仪表盘</span>
447
+ </button>
448
+ <button class="tab-item" type="button" data-tab="memory" aria-selected="false">
449
+ <svg class="ico" aria-hidden="true"><use href="#i-memory"></use></svg><span>记忆</span>
450
+ </button>
451
+ <button class="tab-item" type="button" data-tab="relation" aria-selected="false">
452
+ <svg class="ico" aria-hidden="true"><use href="#i-relation"></use></svg><span>关系</span>
453
+ </button>
454
+ <button class="tab-item" type="button" data-tab="settings" aria-selected="false">
455
+ <svg class="ico" aria-hidden="true"><use href="#i-settings"></use></svg><span>配置</span>
456
+ </button>
457
+ <button class="tab-item" type="button" data-tab="tools" aria-selected="false">
458
+ <svg class="ico" aria-hidden="true"><use href="#i-tools"></use></svg><span>工具</span>
459
+ </button>
460
+ </nav>
461
+
462
+ <script src="panel-layout.js?v=8"></script>
403
463
  <script src="trace-view.js?v=5"></script>
404
- <script src="panel.js?v=6"></script>
464
+ <script src="panel.js?v=9"></script>
405
465
  </body>
406
- </html>
466
+ </html>