diff --git a/apps/memos-local-openclaw/src/viewer/html.ts b/apps/memos-local-openclaw/src/viewer/html.ts index c3b48c7b4..db7016798 100644 --- a/apps/memos-local-openclaw/src/viewer/html.ts +++ b/apps/memos-local-openclaw/src/viewer/html.ts @@ -168,6 +168,27 @@ input,textarea,select{font-family:inherit;font-size:inherit} .card-time{font-size:12px;color:var(--text-sec);display:flex;align-items:center;gap:8px} .session-tag{font-size:11px;font-family:ui-monospace,monospace;color:var(--text-muted);background:rgba(0,0,0,.2);padding:3px 8px;border-radius:6px;cursor:default} .card-summary{font-size:15px;font-weight:600;color:var(--text);margin-bottom:10px;line-height:1.5;letter-spacing:-.01em} +.card-tab-bar{display:flex;gap:2px;margin-bottom:10px;margin-top:2px} +.card-tab-btn{background:transparent;border:none;color:var(--text-muted);font-size:12px;padding:4px 10px;border-radius:6px;cursor:pointer;transition:all .15s;font-family:inherit} +.card-tab-btn:hover{background:rgba(128,128,128,.1);color:var(--text)} +.card-tab-btn.active{background:rgba(99,102,241,.12);color:#818cf8;font-weight:600} +[data-theme="light"] .card-tab-btn.active{background:rgba(99,102,241,.08);color:#4f46e5} +.card-reasoning-section{display:none} +.card-reasoning-section.active{display:block} +.reasoning-chain{margin-top:8px;display:flex;flex-direction:column;gap:8px} +.reasoning-item{display:flex;align-items:flex-start;gap:8px;font-size:12px} +.reasoning-label{font-weight:600;min-width:72px;color:var(--text-sec);padding:2px 6px;border-radius:4px;flex-shrink:0} +.reasoning-label.goal{background:rgba(16,185,129,.12);color:#10b981} +.reasoning-label.decision{background:rgba(59,130,246,.12);color:#3b82f6} +.reasoning-label.correction{background:rgba(239,68,68,.12);color:#ef4444} +.reasoning-label.preference{background:rgba(245,158,11,.12);color:#f59e0b} +.reasoning-label.attention{background:rgba(139,92,246,.12);color:#8b5cf6} +[data-theme="light"] .reasoning-label.goal{background:rgba(16,185,129,.1);color:#059669} +[data-theme="light"] .reasoning-label.decision{background:rgba(59,130,246,.1);color:#2563eb} +[data-theme="light"] .reasoning-label.correction{background:rgba(239,68,68,.1);color:#dc2626} +[data-theme="light"] .reasoning-label.preference{background:rgba(245,158,11,.1);color:#d97706} +[data-theme="light"] .reasoning-label.attention{background:rgba(139,92,246,.1);color:#7c3aed} +.reasoning-value{color:var(--text);line-height:1.5;flex:1} .card-content{font-size:13px;color:var(--text-sec);line-height:1.65;max-height:0;overflow:hidden;transition:max-height .3s ease} .card-content.show{max-height:600px;overflow-y:auto} .card-content pre{white-space:pre-wrap;word-break:break-all;background:rgba(0,0,0,.25);padding:14px;border-radius:10px;font-size:12px;font-family:ui-monospace,monospace;margin-top:10px;border:1px solid var(--border);color:var(--text-sec)} @@ -1380,6 +1401,14 @@ const I18N={ 'card.delete':'Delete', 'card.evolved':'Evolved', 'card.times':'times', + 'card.summaryTab':'Summary', + 'card.reasoningTab':'Reasoning', + 'card.reasoningEmpty':'No reasoning chain', + 'card.reasoningGoal':'Goal', + 'card.reasoningDecision':'Decision', + 'card.reasoningCorrection':'Correction', + 'card.reasoningPreference':'Preference', + 'card.reasoningAttention':'Attention', 'card.updated':'updated', 'card.evolveHistory':'Evolution History', 'card.oldSummary':'Old', @@ -1673,6 +1702,14 @@ const I18N={ 'card.delete':'删除', 'card.evolved':'已演化', 'card.times':'次', + 'card.summaryTab':'摘要', + 'card.reasoningTab':'推理链', + 'card.reasoningEmpty':'暂无推理链', + 'card.reasoningGoal':'目标', + 'card.reasoningDecision':'决策', + 'card.reasoningCorrection':'纠正', + 'card.reasoningPreference':'偏好', + 'card.reasoningAttention':'注意', 'card.updated':'更新于', 'card.evolveHistory':'演化记录', 'card.oldSummary':'旧摘要', @@ -3174,8 +3211,11 @@ async function loadStats(){ if(d.timeRange&&d.timeRange.earliest!=null&&d.timeRange.latest!=null){ let e=Number(d.timeRange.earliest), l=Number(d.timeRange.latest); if(Number.isFinite(e)&&Number.isFinite(l)){ - if(e<1e12) e*=1000; - if(l<1e12) l*=1000; + // Handle different timestamp formats: seconds, milliseconds, microseconds + if (e < 1e15 && e >= 1e12) e = Math.floor(e / 1000); // microseconds to milliseconds + else if (e < 1e12) e *= 1000; // seconds to milliseconds + if (l < 1e15 && l >= 1e12) l = Math.floor(l / 1000); // microseconds to milliseconds + else if (l < 1e12) l *= 1000; // seconds to milliseconds days=Math.round((l-e)/86400000); days=Math.max(0,Math.min(36500,days)); if(days===0) days=1; @@ -3301,6 +3341,26 @@ function clearDateFilter(){ } /* ─── Rendering ─── */ +function buildReasoningChainHtml(rc){ + if(!rc) return '
'+content+'