@memtensor/memos-local-openclaw-plugin 1.0.2-beta.5 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/capture/index.js +52 -8
- package/dist/capture/index.js.map +1 -1
- package/dist/ingest/chunker.d.ts +3 -4
- package/dist/ingest/chunker.d.ts.map +1 -1
- package/dist/ingest/chunker.js +19 -24
- package/dist/ingest/chunker.js.map +1 -1
- package/dist/ingest/providers/anthropic.d.ts +3 -1
- package/dist/ingest/providers/anthropic.d.ts.map +1 -1
- package/dist/ingest/providers/anthropic.js +79 -39
- package/dist/ingest/providers/anthropic.js.map +1 -1
- package/dist/ingest/providers/bedrock.d.ts +3 -1
- package/dist/ingest/providers/bedrock.d.ts.map +1 -1
- package/dist/ingest/providers/bedrock.js +79 -39
- package/dist/ingest/providers/bedrock.js.map +1 -1
- package/dist/ingest/providers/gemini.d.ts +3 -1
- package/dist/ingest/providers/gemini.d.ts.map +1 -1
- package/dist/ingest/providers/gemini.js +77 -39
- package/dist/ingest/providers/gemini.js.map +1 -1
- package/dist/ingest/providers/index.d.ts +3 -1
- package/dist/ingest/providers/index.d.ts.map +1 -1
- package/dist/ingest/providers/index.js +70 -30
- package/dist/ingest/providers/index.js.map +1 -1
- package/dist/ingest/providers/openai.d.ts +3 -1
- package/dist/ingest/providers/openai.d.ts.map +1 -1
- package/dist/ingest/providers/openai.js +80 -39
- package/dist/ingest/providers/openai.js.map +1 -1
- package/dist/ingest/task-processor.d.ts +1 -0
- package/dist/ingest/task-processor.d.ts.map +1 -1
- package/dist/ingest/task-processor.js +33 -9
- package/dist/ingest/task-processor.js.map +1 -1
- package/dist/ingest/worker.d.ts.map +1 -1
- package/dist/ingest/worker.js +29 -13
- package/dist/ingest/worker.js.map +1 -1
- package/dist/recall/engine.d.ts.map +1 -1
- package/dist/recall/engine.js +19 -14
- package/dist/recall/engine.js.map +1 -1
- package/dist/skill/bundled-memory-guide.d.ts +1 -5
- package/dist/skill/bundled-memory-guide.d.ts.map +1 -1
- package/dist/skill/bundled-memory-guide.js +38 -97
- package/dist/skill/bundled-memory-guide.js.map +1 -1
- package/dist/skill/evaluator.js +1 -1
- package/dist/storage/sqlite.d.ts +1 -2
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +90 -17
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/tools/memory-get.d.ts.map +1 -1
- package/dist/tools/memory-get.js +1 -3
- package/dist/tools/memory-get.js.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/update-check.d.ts +21 -0
- package/dist/update-check.d.ts.map +1 -0
- package/dist/update-check.js +111 -0
- package/dist/update-check.js.map +1 -0
- package/dist/viewer/html.d.ts.map +1 -1
- package/dist/viewer/html.js +444 -182
- package/dist/viewer/html.js.map +1 -1
- package/dist/viewer/server.d.ts +1 -1
- package/dist/viewer/server.d.ts.map +1 -1
- package/dist/viewer/server.js +142 -78
- package/dist/viewer/server.js.map +1 -1
- package/index.ts +206 -198
- package/openclaw.plugin.json +3 -0
- package/package.json +5 -1
- package/scripts/postinstall.cjs +69 -2
- package/skill/memos-memory-guide/SKILL.md +73 -36
- package/src/capture/index.ts +52 -8
- package/src/ingest/chunker.ts +22 -30
- package/src/ingest/providers/anthropic.ts +89 -41
- package/src/ingest/providers/bedrock.ts +90 -41
- package/src/ingest/providers/gemini.ts +89 -41
- package/src/ingest/providers/index.ts +81 -35
- package/src/ingest/providers/openai.ts +90 -41
- package/src/ingest/task-processor.ts +29 -8
- package/src/ingest/worker.ts +31 -13
- package/src/recall/engine.ts +20 -13
- package/src/skill/bundled-memory-guide.ts +5 -96
- package/src/skill/evaluator.ts +1 -1
- package/src/storage/sqlite.ts +93 -21
- package/src/tools/memory-get.ts +1 -4
- package/src/types.ts +2 -9
- package/src/update-check.ts +96 -0
- package/src/viewer/html.ts +444 -182
- package/src/viewer/server.ts +101 -66
package/src/viewer/html.ts
CHANGED
|
@@ -41,7 +41,7 @@ return `<!DOCTYPE html>
|
|
|
41
41
|
[data-theme="light"] .auth-screen{background:linear-gradient(135deg,#f0f4ff 0%,#f8f9fb 50%,#eef2ff 100%)}
|
|
42
42
|
[data-theme="light"] .auth-card{box-shadow:0 25px 50px -12px rgba(0,0,0,.08)}
|
|
43
43
|
[data-theme="light"] .topbar{background:rgba(255,255,255,.92);border-bottom-color:var(--border);backdrop-filter:blur(8px)}
|
|
44
|
-
[data-theme="light"] .session-item .count,[data-theme="light"] .
|
|
44
|
+
[data-theme="light"] .session-item .count,[data-theme="light"] .session-tag{background:rgba(0,0,0,.05)}
|
|
45
45
|
[data-theme="light"] .card-content pre{background:#f3f4f6;border-color:var(--border)}
|
|
46
46
|
[data-theme="light"] .vscore-badge{background:rgba(79,70,229,.06);color:#4f46e5}
|
|
47
47
|
[data-theme="light"] ::-webkit-scrollbar-thumb{background:rgba(0,0,0,.15)}
|
|
@@ -66,10 +66,6 @@ return `<!DOCTYPE html>
|
|
|
66
66
|
[data-theme="light"] .tool-agg-table td{background:transparent}
|
|
67
67
|
[data-theme="light"] .tool-agg-table tr:hover td{background:rgba(79,70,229,.03)}
|
|
68
68
|
[data-theme="light"] .tool-agg-table th{color:#9ca3af}
|
|
69
|
-
[data-theme="light"] .breakdown-item{background:#f9fafb;border-color:var(--border)}
|
|
70
|
-
[data-theme="light"] .breakdown-item:hover{background:#f3f4f6;border-color:#cbd5e1}
|
|
71
|
-
[data-theme="light"] .breakdown-bar-wrap{background:#e5e7eb}
|
|
72
|
-
[data-theme="light"] .breakdown-bar{background:linear-gradient(90deg,#4f46e5,#6366f1);box-shadow:none}
|
|
73
69
|
[data-theme="light"] .range-btn{background:transparent;border-color:var(--border);color:var(--text-sec)}
|
|
74
70
|
[data-theme="light"] .range-btn.active{background:rgba(79,70,229,.06);color:#4f46e5;border-color:rgba(79,70,229,.2)}
|
|
75
71
|
[data-theme="light"] .range-btn:hover{border-color:#4f46e5;color:#4f46e5}
|
|
@@ -164,10 +160,9 @@ input,textarea,select{font-family:inherit;font-size:inherit}
|
|
|
164
160
|
.role-tag.user{background:var(--pri-glow);color:var(--pri);border:1px solid rgba(99,102,241,.12)}
|
|
165
161
|
.role-tag.assistant{background:var(--accent-glow);color:var(--accent);border:1px solid rgba(230,57,70,.2)}
|
|
166
162
|
.role-tag.system{background:var(--amber-bg);color:var(--amber);border:1px solid rgba(245,158,11,.2)}
|
|
167
|
-
.kind-tag{padding:4px 10px;border-radius:8px;font-size:11px;color:var(--text-sec);background:rgba(0,0,0,.2);font-weight:500}
|
|
168
163
|
.card-time{font-size:12px;color:var(--text-sec);display:flex;align-items:center;gap:8px}
|
|
169
164
|
.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}
|
|
170
|
-
.card-summary{font-size:15px;font-weight:600;color:var(--text);margin-bottom:10px;line-height:1.5;letter-spacing:-.01em}
|
|
165
|
+
.card-summary{font-size:15px;font-weight:600;color:var(--text);margin-bottom:10px;line-height:1.5;letter-spacing:-.01em;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
|
|
171
166
|
.card-content{font-size:13px;color:var(--text-sec);line-height:1.65;max-height:0;overflow:hidden;transition:max-height .3s ease}
|
|
172
167
|
.card-content.show{max-height:600px;overflow-y:auto}
|
|
173
168
|
.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)}
|
|
@@ -212,6 +207,9 @@ input,textarea,select{font-family:inherit;font-size:inherit}
|
|
|
212
207
|
.modal-meta-row{display:flex;flex-wrap:wrap;gap:12px;font-size:11px;color:var(--text-sec);padding:8px 0;border-top:1px dashed var(--border)}
|
|
213
208
|
[data-theme="light"] .merge-history{background:rgba(0,0,0,.04)}
|
|
214
209
|
[data-theme="light"] .merge-history-item{border-bottom-color:rgba(0,0,0,.06)}
|
|
210
|
+
.card-merged-info{margin-top:8px;padding:8px 12px;background:rgba(16,185,129,.06);border:1px dashed rgba(16,185,129,.2);border-radius:8px;font-size:12px;line-height:1.6;color:var(--text-sec)}
|
|
211
|
+
.card-merged-label{font-size:10px;font-weight:600;color:#10b981;margin-bottom:4px;display:flex;align-items:center;gap:4px}
|
|
212
|
+
[data-theme="light"] .card-merged-info{background:rgba(16,185,129,.04);border-color:rgba(16,185,129,.15)}
|
|
215
213
|
|
|
216
214
|
/* ─── Buttons ─── */
|
|
217
215
|
.btn{padding:7px 14px;border-radius:8px;border:1px solid var(--border);background:var(--bg-card);color:var(--text);font-size:13px;font-weight:500;transition:all .18s ease;display:inline-flex;align-items:center;gap:5px;white-space:nowrap}
|
|
@@ -479,7 +477,41 @@ input,textarea,select{font-family:inherit;font-size:inherit}
|
|
|
479
477
|
.log-stat-chip.merged{background:rgba(168,85,247,.12);color:#c084fc}
|
|
480
478
|
.log-stat-chip.errors{background:rgba(248,113,113,.12);color:#f87171}
|
|
481
479
|
.log-msg-list{margin-top:8px;display:flex;flex-direction:column;gap:4px}
|
|
482
|
-
.log-msg-item{display:flex;gap:8px;align-items:flex-start;font-size:11.5px;line-height:1.5;padding:4px 10px;border-radius:6px;background:rgba(255,255,255,.02)}
|
|
480
|
+
.log-msg-item{display:flex;gap:8px;align-items:flex-start;font-size:11.5px;line-height:1.5;padding:4px 10px;border-radius:6px;background:rgba(255,255,255,.02);overflow:hidden}
|
|
481
|
+
.log-msg-item.expanded{flex-wrap:wrap}
|
|
482
|
+
.recall-layers{margin-top:8px;display:flex;flex-direction:column;gap:10px}
|
|
483
|
+
.recall-layer-title{font-size:11px;font-weight:600;color:var(--text-sec);margin-bottom:4px;display:flex;align-items:center;gap:6px;cursor:pointer;user-select:none}
|
|
484
|
+
.recall-layer-title .recall-expand-icon{transition:transform .15s;font-size:9px}
|
|
485
|
+
.recall-layer.expanded .recall-layer-title .recall-expand-icon{transform:rotate(90deg)}
|
|
486
|
+
.recall-count{font-size:10px;font-weight:700;padding:1px 6px;border-radius:10px;background:rgba(99,102,241,.1);color:var(--pri)}
|
|
487
|
+
.recall-items{display:none;flex-direction:column;gap:3px}
|
|
488
|
+
.recall-layer.expanded .recall-items{display:flex}
|
|
489
|
+
.recall-item{font-size:11px;line-height:1.4;padding:4px 8px;border-radius:5px;background:rgba(255,255,255,.02);cursor:pointer}
|
|
490
|
+
.recall-item:hover{background:rgba(99,102,241,.06)}
|
|
491
|
+
[data-theme="light"] .recall-item{background:rgba(0,0,0,.02)}
|
|
492
|
+
[data-theme="light"] .recall-item:hover{background:rgba(99,102,241,.06)}
|
|
493
|
+
.recall-item-head{display:flex;gap:6px;align-items:center}
|
|
494
|
+
.recall-idx{flex-shrink:0;font-size:10px;font-weight:600;color:var(--text-muted);min-width:14px;text-align:right}
|
|
495
|
+
.recall-score{flex-shrink:0;font-family:'SF Mono',Consolas,monospace;font-size:10px;font-weight:600;padding:1px 5px;border-radius:4px}
|
|
496
|
+
.recall-score.high{background:rgba(34,197,94,.12);color:#22c55e}
|
|
497
|
+
.recall-score.mid{background:rgba(251,191,36,.12);color:#f59e0b}
|
|
498
|
+
.recall-score.low{background:rgba(248,113,113,.1);color:var(--text-muted)}
|
|
499
|
+
.recall-summary-short{flex:1;color:var(--text-sec);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
500
|
+
.recall-expand-icon{flex-shrink:0;font-size:10px;color:var(--text-muted);transition:transform .15s}
|
|
501
|
+
.recall-item.expanded .recall-expand-icon{transform:rotate(90deg)}
|
|
502
|
+
.recall-summary-full{display:none;margin-top:4px;padding:6px 8px 4px 28px;font-size:11px;line-height:1.5;color:var(--text);word-break:break-word;border-top:1px dashed var(--border)}
|
|
503
|
+
.recall-item.expanded .recall-summary-full{display:block}
|
|
504
|
+
.recall-layer.filtered .recall-layer-title{color:var(--pri)}
|
|
505
|
+
.recall-layer.filtered.empty .recall-layer-title{color:var(--text-muted)}
|
|
506
|
+
.recall-more{font-size:10px;color:var(--text-muted);padding:2px 8px}
|
|
507
|
+
.recall-detail{padding:4px 0}
|
|
508
|
+
.recall-detail-section{margin-bottom:10px}
|
|
509
|
+
.recall-detail-title{font-size:11px;font-weight:600;color:var(--text-sec);margin-bottom:6px;padding-bottom:4px;border-bottom:1px dashed var(--border);cursor:pointer;user-select:none;display:flex;align-items:center;gap:6px}
|
|
510
|
+
.recall-detail-title .recall-expand-icon{transition:transform .15s;font-size:9px}
|
|
511
|
+
.recall-detail-section.expanded .recall-detail-title .recall-expand-icon{transform:rotate(90deg)}
|
|
512
|
+
.recall-detail-section .recall-detail-items{display:none;flex-direction:column;gap:3px}
|
|
513
|
+
.recall-detail-section.expanded .recall-detail-items{display:flex}
|
|
514
|
+
.recall-detail-section.filtered .recall-detail-title{color:var(--pri)}
|
|
483
515
|
[data-theme="light"] .log-msg-item{background:rgba(0,0,0,.02)}
|
|
484
516
|
.log-msg-role{flex-shrink:0;font-size:10px;font-weight:600;padding:1px 6px;border-radius:4px;text-transform:uppercase;letter-spacing:.3px}
|
|
485
517
|
.log-msg-role.user{background:rgba(59,130,246,.12);color:#60a5fa}
|
|
@@ -492,6 +524,15 @@ input,textarea,select{font-family:inherit;font-size:inherit}
|
|
|
492
524
|
.log-msg-action.merged{color:#c084fc}
|
|
493
525
|
.log-msg-action.error{color:#f87171}
|
|
494
526
|
.log-msg-text{color:var(--text);opacity:.85;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis}
|
|
527
|
+
.log-msg-text-short{color:var(--text);opacity:.85;flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
528
|
+
.log-msg-text-full{display:none;color:var(--text);opacity:.85;flex:1;min-width:0;word-break:break-word;white-space:pre-wrap}
|
|
529
|
+
.log-msg-item.expanded .log-msg-text-short{display:none}
|
|
530
|
+
.log-msg-item.expanded .log-msg-text-full{display:block}
|
|
531
|
+
.log-msg-item.expanded .recall-expand-icon{transform:rotate(90deg)}
|
|
532
|
+
.log-add-detail{display:flex;flex-direction:column;gap:8px}
|
|
533
|
+
.log-add-msg{display:flex;gap:8px;align-items:flex-start;font-size:12px;line-height:1.6}
|
|
534
|
+
.log-add-msg-role{flex-shrink:0;font-size:10px;font-weight:600;text-transform:uppercase;padding:2px 8px;border-radius:4px;background:rgba(99,102,241,.1);color:var(--pri)}
|
|
535
|
+
.log-add-msg-content{flex:1;min-width:0;word-break:break-word;white-space:pre-wrap;color:var(--text)}
|
|
495
536
|
.log-detail{display:none;border-top:1px solid var(--border);padding:0}
|
|
496
537
|
.log-detail.open{display:block}
|
|
497
538
|
.log-expand-btn{font-size:10px;color:var(--text-sec);opacity:.5;margin-left:auto;transition:transform .2s,opacity .15s;display:inline-block}
|
|
@@ -645,14 +686,6 @@ input,textarea,select{font-family:inherit;font-size:inherit}
|
|
|
645
686
|
.tool-agg-table .ms-val.slow{color:var(--accent)}
|
|
646
687
|
.chart-legend .dot.violet{background:var(--violet)}
|
|
647
688
|
.chart-legend .dot.green{background:var(--green)}
|
|
648
|
-
.breakdown-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:20px}
|
|
649
|
-
.breakdown-item{display:flex;flex-direction:column;gap:5px;padding:10px 12px;background:rgba(255,255,255,.02);border-radius:8px;border:1px solid var(--border);transition:all .15s}
|
|
650
|
-
.breakdown-item:hover{border-color:var(--border-glow);background:rgba(255,255,255,.04)}
|
|
651
|
-
.breakdown-item .bd-top{display:flex;align-items:center;justify-content:space-between}
|
|
652
|
-
.breakdown-item .label{font-size:12px;color:var(--text-sec);font-weight:500;text-transform:capitalize}
|
|
653
|
-
.breakdown-item .value{font-size:13px;font-weight:600;color:var(--text)}
|
|
654
|
-
.breakdown-bar-wrap{height:3px;background:rgba(255,255,255,.06);border-radius:2px;overflow:hidden}
|
|
655
|
-
.breakdown-bar{height:100%;border-radius:2px;background:var(--pri);transition:width .5s ease}
|
|
656
689
|
.metrics-toolbar{display:flex;align-items:center;gap:8px;margin-bottom:16px;flex-wrap:wrap}
|
|
657
690
|
.range-btn{padding:5px 12px;border-radius:6px;border:1px solid var(--border);background:transparent;color:var(--text-sec);font-size:12px;font-weight:500;cursor:pointer;transition:all .15s}
|
|
658
691
|
.range-btn:hover{border-color:var(--pri);color:var(--pri)}
|
|
@@ -809,15 +842,6 @@ input,textarea,select{font-family:inherit;font-size:inherit}
|
|
|
809
842
|
<button class="filter-chip" data-role="assistant" onclick="setRoleFilter(this,'assistant')">Assistant</button>
|
|
810
843
|
<button class="filter-chip" data-role="system" onclick="setRoleFilter(this,'system')">System</button>
|
|
811
844
|
<span class="filter-sep"></span>
|
|
812
|
-
<select id="filterKind" class="filter-select" onchange="applyFilters()">
|
|
813
|
-
<option value="" data-i18n="filter.allkinds">All kinds</option>
|
|
814
|
-
<option value="paragraph" data-i18n="filter.paragraph">Paragraph</option>
|
|
815
|
-
<option value="code_block" data-i18n="filter.code">Code</option>
|
|
816
|
-
<option value="dialog" data-i18n="filter.dialog">Dialog</option>
|
|
817
|
-
<option value="list" data-i18n="filter.list">List</option>
|
|
818
|
-
<option value="error_stack" data-i18n="filter.error">Error</option>
|
|
819
|
-
<option value="command" data-i18n="filter.command">Command</option>
|
|
820
|
-
</select>
|
|
821
845
|
<select id="filterSort" class="filter-select" onchange="applyFilters()">
|
|
822
846
|
<option value="newest" data-i18n="filter.newest">Newest first</option>
|
|
823
847
|
<option value="oldest" data-i18n="filter.oldest">Oldest first</option>
|
|
@@ -951,16 +975,6 @@ input,textarea,select{font-family:inherit;font-size:inherit}
|
|
|
951
975
|
<div id="toolAggTable" style="margin-top:20px"></div>
|
|
952
976
|
</div>
|
|
953
977
|
|
|
954
|
-
<div class="breakdown-grid" style="display:grid;grid-template-columns:1fr 1fr;gap:16px">
|
|
955
|
-
<div class="analytics-section">
|
|
956
|
-
<h3><span class="icon">\u{1F464}</span> <span data-i18n="breakdown.role">By Role</span></h3>
|
|
957
|
-
<div id="breakdownRole"></div>
|
|
958
|
-
</div>
|
|
959
|
-
<div class="analytics-section">
|
|
960
|
-
<h3><span class="icon">\u{1F4DD}</span> <span data-i18n="breakdown.kind">By Kind</span></h3>
|
|
961
|
-
<div id="breakdownKind"></div>
|
|
962
|
-
</div>
|
|
963
|
-
</div>
|
|
964
978
|
</div>
|
|
965
979
|
|
|
966
980
|
<!-- ─── Logs View ─── -->
|
|
@@ -1200,7 +1214,7 @@ input,textarea,select{font-family:inherit;font-size:inherit}
|
|
|
1200
1214
|
</div>
|
|
1201
1215
|
|
|
1202
1216
|
<div id="migrateActions" style="display:flex;gap:12px;align-items:center;flex-wrap:wrap">
|
|
1203
|
-
<button class="btn
|
|
1217
|
+
<button class="btn" onclick="migrateScan(true)" id="migrateScanBtn" style="background:var(--bg);border:1px solid var(--border);color:var(--text);font-weight:600;padding:7px 18px;cursor:pointer" data-i18n="migrate.scan">Scan Data Sources</button>
|
|
1204
1218
|
<button class="btn btn-primary" onclick="migrateStart()" id="migrateStartBtn" style="display:none" data-i18n="migrate.start">Start Import</button>
|
|
1205
1219
|
<span id="migrateConcurrencyRow" style="display:none;align-items:center;gap:6px">
|
|
1206
1220
|
<span style="font-size:11px;color:var(--text-muted)" data-i18n="migrate.concurrency.label">Concurrent agents</span>
|
|
@@ -1341,14 +1355,13 @@ input,textarea,select{font-family:inherit;font-size:inherit}
|
|
|
1341
1355
|
<!-- ─── Memory Modal ─── -->
|
|
1342
1356
|
<div class="modal-overlay" id="modalOverlay">
|
|
1343
1357
|
<div class="modal">
|
|
1344
|
-
<h2 id="modalTitle" data-i18n="modal.
|
|
1358
|
+
<h2 id="modalTitle" data-i18n="modal.edit">Edit Memory</h2>
|
|
1345
1359
|
<div class="form-group"><label data-i18n="modal.role">Role</label><select id="mRole"><option value="user">User</option><option value="assistant">Assistant</option><option value="system">System</option></select></div>
|
|
1346
1360
|
<div class="form-group"><label data-i18n="modal.content">Content</label><textarea id="mContent" rows="4" data-i18n-ph="modal.content.ph" placeholder="Memory content..."></textarea></div>
|
|
1347
1361
|
<div class="form-group"><label data-i18n="modal.summary">Summary</label><input type="text" id="mSummary" data-i18n-ph="modal.summary.ph" placeholder="Brief summary (optional)"></div>
|
|
1348
|
-
<div class="form-group"><label data-i18n="modal.kind">Kind</label><select id="mKind"><option value="paragraph" data-i18n="filter.paragraph">Paragraph</option><option value="code" data-i18n="filter.code">Code</option><option value="dialog" data-i18n="filter.dialog">Dialog</option></select></div>
|
|
1349
1362
|
<div class="modal-actions">
|
|
1350
1363
|
<button class="btn btn-ghost" onclick="closeModal()" data-i18n="modal.cancel">Cancel</button>
|
|
1351
|
-
<button class="btn btn-primary" id="modalSubmit" onclick="submitModal()" data-i18n="modal.
|
|
1364
|
+
<button class="btn btn-primary" id="modalSubmit" onclick="submitModal()" data-i18n="modal.save">Save</button>
|
|
1352
1365
|
</div>
|
|
1353
1366
|
</div>
|
|
1354
1367
|
</div>
|
|
@@ -1438,13 +1451,6 @@ const I18N={
|
|
|
1438
1451
|
'search.meta.text':' text',
|
|
1439
1452
|
'search.meta.results':' results',
|
|
1440
1453
|
'filter.all':'All',
|
|
1441
|
-
'filter.allkinds':'All kinds',
|
|
1442
|
-
'filter.paragraph':'Paragraph',
|
|
1443
|
-
'filter.code':'Code',
|
|
1444
|
-
'filter.dialog':'Dialog',
|
|
1445
|
-
'filter.list':'List',
|
|
1446
|
-
'filter.error':'Error',
|
|
1447
|
-
'filter.command':'Command',
|
|
1448
1454
|
'filter.newest':'Newest first',
|
|
1449
1455
|
'filter.oldest':'Oldest first',
|
|
1450
1456
|
'filter.allowners':'All owners',
|
|
@@ -1460,6 +1466,8 @@ const I18N={
|
|
|
1460
1466
|
'card.delete':'Delete',
|
|
1461
1467
|
'card.evolved':'Evolved',
|
|
1462
1468
|
'card.times':'times',
|
|
1469
|
+
'card.newMessage':'New message',
|
|
1470
|
+
'card.mergedInfo':'Merged memory',
|
|
1463
1471
|
'card.updated':'updated',
|
|
1464
1472
|
'card.evolveHistory':'Evolution History',
|
|
1465
1473
|
'card.oldSummary':'Old',
|
|
@@ -1483,21 +1491,15 @@ const I18N={
|
|
|
1483
1491
|
'chart.toolperf':'Tool Response Time',
|
|
1484
1492
|
'chart.list':'List',
|
|
1485
1493
|
'chart.search':'Search',
|
|
1486
|
-
'breakdown.role':'By Role',
|
|
1487
|
-
'breakdown.kind':'By Kind',
|
|
1488
|
-
'modal.new':'New Memory',
|
|
1489
1494
|
'modal.edit':'Edit Memory',
|
|
1490
1495
|
'modal.role':'Role',
|
|
1491
1496
|
'modal.content':'Content',
|
|
1492
1497
|
'modal.content.ph':'Memory content...',
|
|
1493
1498
|
'modal.summary':'Summary',
|
|
1494
1499
|
'modal.summary.ph':'Brief summary (optional)',
|
|
1495
|
-
'modal.kind':'Kind',
|
|
1496
1500
|
'modal.cancel':'Cancel',
|
|
1497
|
-
'modal.create':'Create',
|
|
1498
1501
|
'modal.save':'Save',
|
|
1499
1502
|
'modal.err.empty':'Please enter content',
|
|
1500
|
-
'toast.created':'Memory created',
|
|
1501
1503
|
'toast.updated':'Memory updated',
|
|
1502
1504
|
'toast.deleted':'Memory deleted',
|
|
1503
1505
|
'toast.opfail':'Operation failed',
|
|
@@ -1524,6 +1526,11 @@ const I18N={
|
|
|
1524
1526
|
'logs.output':'OUTPUT',
|
|
1525
1527
|
'logs.empty':'No logs yet. Logs will appear here when tools are called.',
|
|
1526
1528
|
'logs.ago':'ago',
|
|
1529
|
+
'logs.recall.initial':'Initial Retrieval',
|
|
1530
|
+
'logs.recall.filtered':'LLM Filtered',
|
|
1531
|
+
'logs.recall.noHits':'No matching memories',
|
|
1532
|
+
'logs.recall.noneRelevant':'LLM filter: none relevant',
|
|
1533
|
+
'logs.recall.more':'{n} more...',
|
|
1527
1534
|
'tab.import':'\u{1F4E5} Import',
|
|
1528
1535
|
'tab.settings':'\u2699 Settings',
|
|
1529
1536
|
'settings.modelconfig':'Model Configuration',
|
|
@@ -1552,6 +1559,7 @@ const I18N={
|
|
|
1552
1559
|
'settings.test.loading':'Testing...',
|
|
1553
1560
|
'settings.test.ok':'Connected',
|
|
1554
1561
|
'settings.test.fail':'Failed',
|
|
1562
|
+
'settings.session.expired':'Session expired, please refresh the page to log in again',
|
|
1555
1563
|
'settings.save':'Save Settings',
|
|
1556
1564
|
'settings.reset':'Reset',
|
|
1557
1565
|
'settings.saved':'Saved',
|
|
@@ -1584,12 +1592,18 @@ const I18N={
|
|
|
1584
1592
|
'migrate.scan':'Scan Data Sources',
|
|
1585
1593
|
'migrate.start':'Start Import',
|
|
1586
1594
|
'migrate.scanning':'Scanning...',
|
|
1595
|
+
'migrate.scan.required':'Please scan data sources first',
|
|
1596
|
+
'migrate.scan.done':'Scan complete \u2014 {n} new items found',
|
|
1597
|
+
'migrate.imported.hint':'{n} items already imported',
|
|
1598
|
+
'migrate.reconnect.hint':'--- {n} items processed before page reload ---',
|
|
1587
1599
|
'migrate.stat.stored':'Stored',
|
|
1588
1600
|
'migrate.stat.skipped':'Skipped',
|
|
1589
1601
|
'migrate.stat.merged':'Merged',
|
|
1590
1602
|
'migrate.stat.errors':'Errors',
|
|
1591
1603
|
'migrate.phase.sqlite':'Importing memory index...',
|
|
1592
1604
|
'migrate.phase.sessions':'Importing conversation history...',
|
|
1605
|
+
'migrate.phase.stopped':'Import stopped',
|
|
1606
|
+
'migrate.phase.done':'Import completed',
|
|
1593
1607
|
'migrate.chunks':'chunks',
|
|
1594
1608
|
'migrate.sessions.count':'sessions, {n} messages',
|
|
1595
1609
|
'migrate.nodata':'No OpenClaw data found to import.',
|
|
@@ -1615,7 +1629,8 @@ const I18N={
|
|
|
1615
1629
|
'pp.select.warn':'Please select at least one option.',
|
|
1616
1630
|
'pp.skill.created':'Skill created',
|
|
1617
1631
|
'pp.stat.tasks':'Tasks',
|
|
1618
|
-
'pp.stat.skills':'
|
|
1632
|
+
'pp.stat.skills':'Evolutions',
|
|
1633
|
+
'pp.stat.skills.total':'Skills',
|
|
1619
1634
|
'pp.stat.errors':'Errors',
|
|
1620
1635
|
'pp.stat.skipped':'Skipped',
|
|
1621
1636
|
'pp.info.skipped':'{n} sessions already processed, skipping.',
|
|
@@ -1675,6 +1690,10 @@ const I18N={
|
|
|
1675
1690
|
'skill.save.error':'Failed to save skill: ',
|
|
1676
1691
|
'update.available':'New version available',
|
|
1677
1692
|
'update.run':'Run',
|
|
1693
|
+
'update.btn':'Update now',
|
|
1694
|
+
'update.installing':'Installing update...',
|
|
1695
|
+
'update.success':'Update installed! Restarting...',
|
|
1696
|
+
'update.failed':'Update failed',
|
|
1678
1697
|
'update.dismiss':'Dismiss'
|
|
1679
1698
|
},
|
|
1680
1699
|
zh:{
|
|
@@ -1753,13 +1772,6 @@ const I18N={
|
|
|
1753
1772
|
'search.meta.text':' 文本',
|
|
1754
1773
|
'search.meta.results':' 条结果',
|
|
1755
1774
|
'filter.all':'全部',
|
|
1756
|
-
'filter.allkinds':'所有类型',
|
|
1757
|
-
'filter.paragraph':'段落',
|
|
1758
|
-
'filter.code':'代码',
|
|
1759
|
-
'filter.dialog':'对话',
|
|
1760
|
-
'filter.list':'列表',
|
|
1761
|
-
'filter.error':'错误',
|
|
1762
|
-
'filter.command':'命令',
|
|
1763
1775
|
'filter.newest':'最新优先',
|
|
1764
1776
|
'filter.oldest':'最早优先',
|
|
1765
1777
|
'filter.allowners':'所有归属',
|
|
@@ -1775,6 +1787,8 @@ const I18N={
|
|
|
1775
1787
|
'card.delete':'删除',
|
|
1776
1788
|
'card.evolved':'已演化',
|
|
1777
1789
|
'card.times':'次',
|
|
1790
|
+
'card.newMessage':'新消息',
|
|
1791
|
+
'card.mergedInfo':'合并记忆',
|
|
1778
1792
|
'card.updated':'更新于',
|
|
1779
1793
|
'card.evolveHistory':'演化记录',
|
|
1780
1794
|
'card.oldSummary':'旧摘要',
|
|
@@ -1798,21 +1812,15 @@ const I18N={
|
|
|
1798
1812
|
'chart.toolperf':'工具响应耗时',
|
|
1799
1813
|
'chart.list':'列表',
|
|
1800
1814
|
'chart.search':'搜索',
|
|
1801
|
-
'breakdown.role':'按角色',
|
|
1802
|
-
'breakdown.kind':'按类型',
|
|
1803
|
-
'modal.new':'新建记忆',
|
|
1804
1815
|
'modal.edit':'编辑记忆',
|
|
1805
1816
|
'modal.role':'角色',
|
|
1806
1817
|
'modal.content':'内容',
|
|
1807
1818
|
'modal.content.ph':'记忆内容...',
|
|
1808
1819
|
'modal.summary':'摘要',
|
|
1809
1820
|
'modal.summary.ph':'简要摘要(可选)',
|
|
1810
|
-
'modal.kind':'类型',
|
|
1811
1821
|
'modal.cancel':'取消',
|
|
1812
|
-
'modal.create':'创建',
|
|
1813
1822
|
'modal.save':'保存',
|
|
1814
1823
|
'modal.err.empty':'请输入内容',
|
|
1815
|
-
'toast.created':'记忆已创建',
|
|
1816
1824
|
'toast.updated':'记忆已更新',
|
|
1817
1825
|
'toast.deleted':'记忆已删除',
|
|
1818
1826
|
'toast.opfail':'操作失败',
|
|
@@ -1839,6 +1847,11 @@ const I18N={
|
|
|
1839
1847
|
'logs.output':'输出',
|
|
1840
1848
|
'logs.empty':'暂无日志。当工具被调用时日志会显示在这里。',
|
|
1841
1849
|
'logs.ago':'前',
|
|
1850
|
+
'logs.recall.initial':'初始检索',
|
|
1851
|
+
'logs.recall.filtered':'LLM 过滤后',
|
|
1852
|
+
'logs.recall.noHits':'未匹配到记忆',
|
|
1853
|
+
'logs.recall.noneRelevant':'LLM 过滤:无相关记忆',
|
|
1854
|
+
'logs.recall.more':'还有 {n} 条...',
|
|
1842
1855
|
'tab.import':'\u{1F4E5} 导入',
|
|
1843
1856
|
'tab.settings':'\u2699 设置',
|
|
1844
1857
|
'settings.modelconfig':'模型配置',
|
|
@@ -1867,6 +1880,7 @@ const I18N={
|
|
|
1867
1880
|
'settings.test.loading':'测试中...',
|
|
1868
1881
|
'settings.test.ok':'连接成功',
|
|
1869
1882
|
'settings.test.fail':'连接失败',
|
|
1883
|
+
'settings.session.expired':'登录已过期,请刷新页面重新登录',
|
|
1870
1884
|
'settings.save':'保存设置',
|
|
1871
1885
|
'settings.reset':'重置',
|
|
1872
1886
|
'settings.saved':'已保存',
|
|
@@ -1899,12 +1913,18 @@ const I18N={
|
|
|
1899
1913
|
'migrate.scan':'扫描数据源',
|
|
1900
1914
|
'migrate.start':'开始导入',
|
|
1901
1915
|
'migrate.scanning':'扫描中...',
|
|
1916
|
+
'migrate.scan.required':'请先扫描数据源',
|
|
1917
|
+
'migrate.scan.done':'扫描完成 — 发现 {n} 条新数据可导入',
|
|
1918
|
+
'migrate.imported.hint':'已导入 {n} 条记忆',
|
|
1919
|
+
'migrate.reconnect.hint':'--- 页面刷新前已处理 {n} 条 ---',
|
|
1902
1920
|
'migrate.stat.stored':'已存储',
|
|
1903
1921
|
'migrate.stat.skipped':'已跳过',
|
|
1904
1922
|
'migrate.stat.merged':'已合并',
|
|
1905
1923
|
'migrate.stat.errors':'错误',
|
|
1906
1924
|
'migrate.phase.sqlite':'正在导入记忆索引...',
|
|
1907
1925
|
'migrate.phase.sessions':'正在导入对话历史...',
|
|
1926
|
+
'migrate.phase.stopped':'导入已停止',
|
|
1927
|
+
'migrate.phase.done':'导入完成',
|
|
1908
1928
|
'migrate.chunks':'条记忆',
|
|
1909
1929
|
'migrate.sessions.count':'个会话,{n} 条消息',
|
|
1910
1930
|
'migrate.nodata':'未找到可导入的 OpenClaw 数据。',
|
|
@@ -1930,7 +1950,8 @@ const I18N={
|
|
|
1930
1950
|
'pp.select.warn':'请至少选择一个选项。',
|
|
1931
1951
|
'pp.skill.created':'技能已创建',
|
|
1932
1952
|
'pp.stat.tasks':'任务',
|
|
1933
|
-
'pp.stat.skills':'
|
|
1953
|
+
'pp.stat.skills':'进化',
|
|
1954
|
+
'pp.stat.skills.total':'技能',
|
|
1934
1955
|
'pp.stat.errors':'错误',
|
|
1935
1956
|
'pp.stat.skipped':'已跳过',
|
|
1936
1957
|
'pp.info.skipped':'已有 {n} 个会话处理过,自动跳过。',
|
|
@@ -1990,6 +2011,10 @@ const I18N={
|
|
|
1990
2011
|
'skill.save.error':'保存技能失败:',
|
|
1991
2012
|
'update.available':'发现新版本',
|
|
1992
2013
|
'update.run':'执行命令',
|
|
2014
|
+
'update.btn':'立即更新',
|
|
2015
|
+
'update.installing':'正在安装更新...',
|
|
2016
|
+
'update.success':'更新成功!正在重启...',
|
|
2017
|
+
'update.failed':'更新失败',
|
|
1993
2018
|
'update.dismiss':'关闭'
|
|
1994
2019
|
}
|
|
1995
2020
|
};
|
|
@@ -2139,7 +2164,7 @@ function switchView(view){
|
|
|
2139
2164
|
loadModelHealth();
|
|
2140
2165
|
} else if(view==='import'){
|
|
2141
2166
|
migrateView.classList.add('show');
|
|
2142
|
-
if(!window._migrateRunning) migrateScan();
|
|
2167
|
+
if(!window._migrateRunning) migrateScan(false);
|
|
2143
2168
|
}
|
|
2144
2169
|
}
|
|
2145
2170
|
}
|
|
@@ -2207,6 +2232,39 @@ function formatLogTime(ts){
|
|
|
2207
2232
|
return y+'-'+m+'-'+day+' '+time;
|
|
2208
2233
|
}
|
|
2209
2234
|
|
|
2235
|
+
function parseMemoryAddEntries(out){
|
|
2236
|
+
var lines=out.split('\\n');
|
|
2237
|
+
var results=[];
|
|
2238
|
+
for(var i=0;i<lines.length;i++){
|
|
2239
|
+
var line=lines[i].trim();
|
|
2240
|
+
if(!line) continue;
|
|
2241
|
+
if(line.startsWith('{')){
|
|
2242
|
+
try{
|
|
2243
|
+
var obj=JSON.parse(line);
|
|
2244
|
+
if(obj.role&&obj.action){results.push({role:obj.role,action:obj.action,summary:obj.summary||'',content:obj.content||'',reason:obj.reason||''});continue;}
|
|
2245
|
+
}catch(e){}
|
|
2246
|
+
}
|
|
2247
|
+
var rm=line.match(/^\\[(\\w+)\\]\\s*([^\u2192]+)\u2192/);
|
|
2248
|
+
if(rm){
|
|
2249
|
+
var role=rm[1],actionRaw=rm[2].trim();
|
|
2250
|
+
var action='stored';
|
|
2251
|
+
if(actionRaw.indexOf('exact-dup')>=0||actionRaw.indexOf('\u23ED')>=0) action='exact-dup';
|
|
2252
|
+
else if(actionRaw.indexOf('dedup')>=0||actionRaw.indexOf('\uD83D\uDD01')>=0) action='dedup';
|
|
2253
|
+
else if(actionRaw.indexOf('merged')>=0||actionRaw.indexOf('\uD83D\uDD00')>=0) action='merged';
|
|
2254
|
+
else if(actionRaw.indexOf('error')>=0||actionRaw.indexOf('\u274C')>=0) action='error';
|
|
2255
|
+
var afterArrow=line.replace(/^\\[\\w+\\]\\s*[^\u2192]+\u2192\\s*/,'');
|
|
2256
|
+
var contentLines=[afterArrow];
|
|
2257
|
+
while(i+1<lines.length&&!lines[i+1].trim().startsWith('[')&&!lines[i+1].trim().startsWith('{')){
|
|
2258
|
+
i++;
|
|
2259
|
+
if(lines[i].trim()) contentLines.push(lines[i]);
|
|
2260
|
+
else contentLines.push('');
|
|
2261
|
+
}
|
|
2262
|
+
results.push({role:role,action:action,summary:'',content:contentLines.join('\\n'),reason:''});
|
|
2263
|
+
}
|
|
2264
|
+
}
|
|
2265
|
+
return results;
|
|
2266
|
+
}
|
|
2267
|
+
|
|
2210
2268
|
function buildLogSummary(lg){
|
|
2211
2269
|
let inputObj=null;
|
|
2212
2270
|
try{inputObj=JSON.parse(lg.input);}catch(_){}
|
|
@@ -2214,11 +2272,54 @@ function buildLogSummary(lg){
|
|
|
2214
2272
|
const tn=lg.toolName;
|
|
2215
2273
|
if(tn==='memory_search'&&inputObj){
|
|
2216
2274
|
const q=inputObj.query||'';
|
|
2217
|
-
if(q) html+='<div class="log-summary-query">'+escapeHtml(q
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
if(
|
|
2221
|
-
|
|
2275
|
+
if(q) html+='<div class="log-summary-query">'+escapeHtml(q)+'</div>';
|
|
2276
|
+
var recallData=null;
|
|
2277
|
+
try{recallData=JSON.parse(lg.output);}catch(_){}
|
|
2278
|
+
if(recallData&&recallData.candidates){
|
|
2279
|
+
var cands=recallData.candidates||[];
|
|
2280
|
+
var filtered=recallData.filtered||[];
|
|
2281
|
+
if(cands.length===0){
|
|
2282
|
+
html+='<div style="margin-top:4px;font-size:11px;color:var(--text-sec)">\u2205 '+t('logs.recall.noHits')+'</div>';
|
|
2283
|
+
}else{
|
|
2284
|
+
html+='<div class="recall-layers">';
|
|
2285
|
+
html+='<div class="recall-layer" onclick="this.classList.toggle(\\\'expanded\\\')">';
|
|
2286
|
+
html+='<div class="recall-layer-title"><span class="recall-expand-icon">\u25B6</span>\u{1F50D} '+t('logs.recall.initial')+' <span class="recall-count">'+cands.length+'</span></div>';
|
|
2287
|
+
html+='<div class="recall-items">';
|
|
2288
|
+
cands.forEach(function(c,i){
|
|
2289
|
+
var scoreClass=c.score>=0.7?'high':c.score>=0.5?'mid':'low';
|
|
2290
|
+
var shortText=escapeHtml(c.summary||c.content||c.original_excerpt||'');
|
|
2291
|
+
var fullText=escapeHtml(c.content||c.original_excerpt||c.summary||'');
|
|
2292
|
+
html+='<div class="recall-item" onclick="event.stopPropagation();this.classList.toggle(\\\'expanded\\\')">';
|
|
2293
|
+
html+='<div class="recall-item-head"><span class="recall-score '+scoreClass+'">'+c.score.toFixed(2)+'</span><span class="log-msg-role '+(c.role||'user')+'">'+(c.role||'user')+'</span><span class="recall-summary-short">'+shortText+'</span><span class="recall-expand-icon">\u25B6</span></div>';
|
|
2294
|
+
html+='<div class="recall-summary-full">'+fullText+'</div>';
|
|
2295
|
+
html+='</div>';
|
|
2296
|
+
});
|
|
2297
|
+
html+='</div></div>';
|
|
2298
|
+
if(filtered.length>0){
|
|
2299
|
+
html+='<div class="recall-layer filtered" onclick="this.classList.toggle(\\\'expanded\\\')">';
|
|
2300
|
+
html+='<div class="recall-layer-title"><span class="recall-expand-icon">\u25B6</span>\u2705 '+t('logs.recall.filtered')+' <span class="recall-count">'+filtered.length+'</span></div>';
|
|
2301
|
+
html+='<div class="recall-items">';
|
|
2302
|
+
filtered.forEach(function(f){
|
|
2303
|
+
var scoreClass=f.score>=0.7?'high':f.score>=0.5?'mid':'low';
|
|
2304
|
+
var shortText=escapeHtml(f.summary||f.content||f.original_excerpt||'');
|
|
2305
|
+
var fullText=escapeHtml(f.content||f.original_excerpt||f.summary||'');
|
|
2306
|
+
html+='<div class="recall-item" onclick="event.stopPropagation();this.classList.toggle(\\\'expanded\\\')">';
|
|
2307
|
+
html+='<div class="recall-item-head"><span class="recall-score '+scoreClass+'">'+f.score.toFixed(2)+'</span><span class="log-msg-role '+(f.role||'user')+'">'+(f.role||'user')+'</span><span class="recall-summary-short">'+shortText+'</span><span class="recall-expand-icon">\u25B6</span></div>';
|
|
2308
|
+
html+='<div class="recall-summary-full">'+fullText+'</div>';
|
|
2309
|
+
html+='</div>';
|
|
2310
|
+
});
|
|
2311
|
+
html+='</div></div>';
|
|
2312
|
+
}else{
|
|
2313
|
+
html+='<div style="font-size:10px;color:var(--text-muted);margin-top:2px">\u26A0 '+t('logs.recall.noneRelevant')+'</div>';
|
|
2314
|
+
}
|
|
2315
|
+
html+='</div>';
|
|
2316
|
+
}
|
|
2317
|
+
}else{
|
|
2318
|
+
var outLines=(lg.output||'').split('\\n');
|
|
2319
|
+
var memCount=outLines.filter(function(l){return l.match(/^\\d+\\.\\s*\\[/)}).length;
|
|
2320
|
+
if(memCount>0) html+='<div style="margin-top:4px;font-size:11px;color:var(--text-sec)">\u{1F4CE} '+memCount+' memories retrieved</div>';
|
|
2321
|
+
else if(lg.output&&lg.output.includes('no hits')) html+='<div style="margin-top:4px;font-size:11px;color:var(--text-sec)">\u2205 No matching memories</div>';
|
|
2322
|
+
}
|
|
2222
2323
|
}else if(tn==='memory_add'&&inputObj){
|
|
2223
2324
|
const out=lg.output||'';
|
|
2224
2325
|
const statsMatch=out.match(/^([^\\n]+)/);
|
|
@@ -2231,39 +2332,18 @@ function buildLogSummary(lg){
|
|
|
2231
2332
|
});
|
|
2232
2333
|
html+='</div>';
|
|
2233
2334
|
}
|
|
2234
|
-
|
|
2235
|
-
if(
|
|
2236
|
-
html+='<div class="log-msg-list">';
|
|
2237
|
-
outLines.forEach(function(l){
|
|
2238
|
-
var rm=l.match(/^\\[(\\w+)\\]\\s*([^\u2192]+)\u2192\\s*(.*)/);
|
|
2239
|
-
if(rm){
|
|
2240
|
-
var role=rm[1],actionRaw=rm[2].trim(),text=rm[3].trim();
|
|
2241
|
-
var actionCls='stored';
|
|
2242
|
-
if(actionRaw.indexOf('exact-dup')>=0||actionRaw.indexOf('\u23ED')>=0) actionCls='exact-dup';
|
|
2243
|
-
else if(actionRaw.indexOf('dedup')>=0||actionRaw.indexOf('\uD83D\uDD01')>=0) actionCls='dedup';
|
|
2244
|
-
else if(actionRaw.indexOf('merged')>=0||actionRaw.indexOf('\uD83D\uDD00')>=0) actionCls='merged';
|
|
2245
|
-
else if(actionRaw.indexOf('error')>=0||actionRaw.indexOf('\u274C')>=0) actionCls='error';
|
|
2246
|
-
var actionLabel={'stored':'\u2713 stored','exact-dup':'\u23ED skip','dedup':'\uD83D\uDD01 dedup','merged':'\uD83D\uDD00 merged','error':'\u2717 error'}[actionCls]||actionCls;
|
|
2247
|
-
html+='<div class="log-msg-item">'+
|
|
2248
|
-
'<span class="log-msg-role '+role+'">'+role+'</span>'+
|
|
2249
|
-
'<span class="log-msg-action '+actionCls+'">'+actionLabel+'</span>'+
|
|
2250
|
-
'<span class="log-msg-text">'+escapeHtml(text.length>150?text.slice(0,150)+'...':text)+'</span>'+
|
|
2251
|
-
'</div>';
|
|
2252
|
-
}else{
|
|
2253
|
-
html+='<div class="log-msg-item"><span class="log-msg-text">'+escapeHtml(l.length>200?l.slice(0,200)+'...':l)+'</span></div>';
|
|
2254
|
-
}
|
|
2255
|
-
});
|
|
2256
|
-
html+='</div>';
|
|
2257
|
-
}else if(inputObj.details&&Array.isArray(inputObj.details)&&inputObj.details.length>0){
|
|
2335
|
+
var parsed=parseMemoryAddEntries(out);
|
|
2336
|
+
if(parsed.length>0){
|
|
2258
2337
|
html+='<div class="log-msg-list">';
|
|
2259
|
-
|
|
2260
|
-
var
|
|
2261
|
-
var
|
|
2262
|
-
|
|
2263
|
-
|
|
2264
|
-
|
|
2265
|
-
|
|
2266
|
-
|
|
2338
|
+
parsed.forEach(function(e){
|
|
2339
|
+
var actionCls=e.action==='exact-dup'?'exact-dup':e.action==='dedup'?'dedup':e.action==='merged'?'merged':e.action==='error'?'error':'stored';
|
|
2340
|
+
var actionLabel={'stored':'\u2713 stored','exact-dup':'\u23ED skip','dedup':'\uD83D\uDD01 dedup','merged':'\uD83D\uDD00 merged','error':'\u2717 error'}[actionCls]||actionCls;
|
|
2341
|
+
var displayText=e.content.split('\\n')[0].trim();
|
|
2342
|
+
html+='<div class="log-msg-item">'+
|
|
2343
|
+
'<span class="log-msg-role '+e.role+'">'+e.role+'</span>'+
|
|
2344
|
+
'<span class="log-msg-action '+actionCls+'">'+actionLabel+'</span>'+
|
|
2345
|
+
'<span class="log-msg-text">'+escapeHtml(displayText)+'</span>'+
|
|
2346
|
+
'</div>';
|
|
2267
2347
|
});
|
|
2268
2348
|
html+='</div>';
|
|
2269
2349
|
}
|
|
@@ -2271,11 +2351,53 @@ function buildLogSummary(lg){
|
|
|
2271
2351
|
const keys=Object.keys(inputObj);
|
|
2272
2352
|
keys.slice(0,4).forEach(k=>{
|
|
2273
2353
|
const v=String(inputObj[k]);
|
|
2274
|
-
html+='<span class="log-summary-kv"><span class="kv-label">'+escapeHtml(k)+':</span><span class="kv-val">'+escapeHtml(v
|
|
2354
|
+
html+='<span class="log-summary-kv"><span class="kv-label">'+escapeHtml(k)+':</span><span class="kv-val">'+escapeHtml(v)+'</span></span>';
|
|
2275
2355
|
});
|
|
2276
2356
|
}
|
|
2277
2357
|
return html;
|
|
2278
2358
|
}
|
|
2359
|
+
function buildRecallDetailHtml(rd){
|
|
2360
|
+
var html='<div class="recall-detail">';
|
|
2361
|
+
var cands=rd.candidates||[];
|
|
2362
|
+
var filtered=rd.filtered||[];
|
|
2363
|
+
if(cands.length>0){
|
|
2364
|
+
html+='<div class="recall-detail-section" onclick="this.classList.toggle(\\\'expanded\\\')">';
|
|
2365
|
+
html+='<div class="recall-detail-title"><span class="recall-expand-icon">\u25B6</span>\u{1F50D} '+t('logs.recall.initial')+' ('+cands.length+')</div>';
|
|
2366
|
+
html+='<div class="recall-detail-items">';
|
|
2367
|
+
cands.forEach(function(c,i){
|
|
2368
|
+
var scoreClass=c.score>=0.7?'high':c.score>=0.5?'mid':'low';
|
|
2369
|
+
var shortText=escapeHtml(c.summary||c.content||c.original_excerpt||'');
|
|
2370
|
+
var fullText=escapeHtml(c.content||c.original_excerpt||c.summary||'');
|
|
2371
|
+
html+='<div class="recall-item" onclick="event.stopPropagation();this.classList.toggle(\\\'expanded\\\')">';
|
|
2372
|
+
html+='<div class="recall-item-head"><span class="recall-idx">'+(i+1)+'</span><span class="recall-score '+scoreClass+'">'+c.score.toFixed(3)+'</span><span class="log-msg-role '+(c.role||'user')+'">'+(c.role||'user')+'</span><span class="recall-summary-short">'+shortText+'</span><span class="recall-expand-icon">\u25B6</span></div>';
|
|
2373
|
+
html+='<div class="recall-summary-full">'+fullText+'</div>';
|
|
2374
|
+
html+='</div>';
|
|
2375
|
+
});
|
|
2376
|
+
html+='</div></div>';
|
|
2377
|
+
}
|
|
2378
|
+
if(filtered.length>0){
|
|
2379
|
+
html+='<div class="recall-detail-section filtered" onclick="this.classList.toggle(\\\'expanded\\\')">';
|
|
2380
|
+
html+='<div class="recall-detail-title"><span class="recall-expand-icon">\u25B6</span>\u2705 '+t('logs.recall.filtered')+' ('+filtered.length+')</div>';
|
|
2381
|
+
html+='<div class="recall-detail-items">';
|
|
2382
|
+
filtered.forEach(function(f,i){
|
|
2383
|
+
var scoreClass=f.score>=0.7?'high':f.score>=0.5?'mid':'low';
|
|
2384
|
+
var shortText=escapeHtml(f.summary||f.content||f.original_excerpt||'');
|
|
2385
|
+
var fullText=escapeHtml(f.content||f.original_excerpt||f.summary||'');
|
|
2386
|
+
html+='<div class="recall-item" onclick="event.stopPropagation();this.classList.toggle(\\\'expanded\\\')">';
|
|
2387
|
+
html+='<div class="recall-item-head"><span class="recall-idx">'+(i+1)+'</span><span class="recall-score '+scoreClass+'">'+f.score.toFixed(3)+'</span><span class="log-msg-role '+(f.role||'user')+'">'+(f.role||'user')+'</span><span class="recall-summary-short">'+shortText+'</span><span class="recall-expand-icon">\u25B6</span></div>';
|
|
2388
|
+
html+='<div class="recall-summary-full">'+fullText+'</div>';
|
|
2389
|
+
html+='</div>';
|
|
2390
|
+
});
|
|
2391
|
+
html+='</div></div>';
|
|
2392
|
+
}else if(cands.length>0){
|
|
2393
|
+
html+='<div style="font-size:10px;color:var(--text-muted);margin-top:4px">\u26A0 '+t('logs.recall.noneRelevant')+'</div>';
|
|
2394
|
+
}
|
|
2395
|
+
if(rd.status==='error'&&rd.error){
|
|
2396
|
+
html+='<div style="margin-top:8px;color:var(--accent);font-size:12px">\u274C '+escapeHtml(rd.error)+'</div>';
|
|
2397
|
+
}
|
|
2398
|
+
html+='</div>';
|
|
2399
|
+
return html;
|
|
2400
|
+
}
|
|
2279
2401
|
function renderLogs(logs){
|
|
2280
2402
|
const el=document.getElementById('logsList');
|
|
2281
2403
|
if(!logs.length){
|
|
@@ -2288,7 +2410,29 @@ function renderLogs(logs){
|
|
|
2288
2410
|
const toolCls=lg.toolName.replace(/[^a-zA-Z0-9_]/g,'_');
|
|
2289
2411
|
const dur=lg.durationMs<1000?Math.round(lg.durationMs)+'ms':(lg.durationMs/1000).toFixed(1)+'s';
|
|
2290
2412
|
let inputDisplay='';
|
|
2291
|
-
|
|
2413
|
+
let inputHtml='';
|
|
2414
|
+
let outputHtml='';
|
|
2415
|
+
try{
|
|
2416
|
+
const parsed=JSON.parse(lg.input);
|
|
2417
|
+
if(lg.toolName==='memory_add'){
|
|
2418
|
+
var addEntries=parseMemoryAddEntries(lg.output||'');
|
|
2419
|
+
if(addEntries.length>0){
|
|
2420
|
+
inputHtml='<div class="log-add-detail">';
|
|
2421
|
+
addEntries.forEach(function(e){
|
|
2422
|
+
inputHtml+='<div class="log-add-msg"><div class="log-add-msg-role">'+escapeHtml(e.role)+'</div><div class="log-add-msg-content">'+escapeHtml(e.content).replace(/\\n/g,'<br>')+'</div></div>';
|
|
2423
|
+
});
|
|
2424
|
+
inputHtml+='</div>';
|
|
2425
|
+
}
|
|
2426
|
+
}else if(parsed.type==='auto_recall'||parsed.type==='tool_call'){
|
|
2427
|
+
inputDisplay=JSON.stringify({query:parsed.query},null,2);
|
|
2428
|
+
}else{
|
|
2429
|
+
inputDisplay=JSON.stringify(parsed,null,2);
|
|
2430
|
+
}
|
|
2431
|
+
}catch(_){inputDisplay=lg.input;}
|
|
2432
|
+
try{
|
|
2433
|
+
var rd2=null;try{rd2=JSON.parse(lg.output);}catch(_e){}
|
|
2434
|
+
if(rd2&&rd2.candidates){outputHtml=buildRecallDetailHtml(rd2);}
|
|
2435
|
+
}catch(_){}
|
|
2292
2436
|
const summary=buildLogSummary(lg);
|
|
2293
2437
|
return '<div class="log-entry" id="log-'+i+'">'+
|
|
2294
2438
|
'<div class="log-header" onclick="toggleLog('+i+')">'+
|
|
@@ -2302,11 +2446,11 @@ function renderLogs(logs){
|
|
|
2302
2446
|
'<div class="log-detail" id="log-detail-'+i+'">'+
|
|
2303
2447
|
'<div class="log-io-section">'+
|
|
2304
2448
|
'<div class="log-io-label">\u25B6 '+t('logs.input')+'</div>'+
|
|
2305
|
-
'<pre class="log-io-content">'+escapeHtml(inputDisplay)+'</pre>'+
|
|
2449
|
+
(inputHtml?inputHtml:'<pre class="log-io-content">'+escapeHtml(inputDisplay)+'</pre>')+
|
|
2306
2450
|
'</div>'+
|
|
2307
2451
|
'<div class="log-io-section">'+
|
|
2308
2452
|
'<div class="log-io-label">\u25C0 '+t('logs.output')+'</div>'+
|
|
2309
|
-
'<pre class="log-io-content">'+escapeHtml(lg.output)+'</pre>'+
|
|
2453
|
+
(outputHtml?outputHtml:'<pre class="log-io-content">'+escapeHtml(lg.output)+'</pre>')+
|
|
2310
2454
|
'</div>'+
|
|
2311
2455
|
'</div>'+
|
|
2312
2456
|
'</div>';
|
|
@@ -2349,8 +2493,6 @@ async function loadMetrics(){
|
|
|
2349
2493
|
document.getElementById('mSessions').textContent=formatNum(d.totals.sessions);
|
|
2350
2494
|
document.getElementById('mEmbeddings').textContent=formatNum(d.totals.embeddings);
|
|
2351
2495
|
renderChartWrites(d.writesPerDay);
|
|
2352
|
-
renderBreakdown(d.roleBreakdown,'breakdownRole');
|
|
2353
|
-
renderBreakdown(d.kindBreakdown,'breakdownKind');
|
|
2354
2496
|
loadToolMetrics();
|
|
2355
2497
|
}
|
|
2356
2498
|
|
|
@@ -2866,7 +3008,7 @@ function classifyError(msg){
|
|
|
2866
3008
|
if(msg.indexOf('ECONNREFUSED')>=0) return 'Connection refused';
|
|
2867
3009
|
if(msg.indexOf('ENOTFOUND')>=0) return 'DNS resolution failed';
|
|
2868
3010
|
if(msg.indexOf('403')>=0) return 'Forbidden (403)';
|
|
2869
|
-
return msg
|
|
3011
|
+
return msg;
|
|
2870
3012
|
}
|
|
2871
3013
|
|
|
2872
3014
|
function shortenModel(s){return s?s.replace('openai_compatible/','').replace('openai/',''):'\u2014';}
|
|
@@ -3055,6 +3197,7 @@ async function saveConfig(){
|
|
|
3055
3197
|
// 2) Test embedding
|
|
3056
3198
|
try{
|
|
3057
3199
|
var er=await fetch('/api/test-model',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({type:'embedding',provider:cfg.embedding.provider,model:cfg.embedding.model||'',endpoint:cfg.embedding.endpoint||'',apiKey:cfg.embedding.apiKey||''})});
|
|
3200
|
+
if(er.status===401){done();toast(t('settings.session.expired'),'error');return;}
|
|
3058
3201
|
var ed=await er.json();
|
|
3059
3202
|
if(!ed.ok){done();toast(t('settings.save.emb.fail')+': '+ed.error,'error');document.getElementById('testEmbResult').className='test-result fail';document.getElementById('testEmbResult').innerHTML='\\u274C '+ed.error;return;}
|
|
3060
3203
|
document.getElementById('testEmbResult').className='test-result ok';document.getElementById('testEmbResult').innerHTML='\\u2705 '+t('settings.test.ok');
|
|
@@ -3064,6 +3207,7 @@ async function saveConfig(){
|
|
|
3064
3207
|
if(hasSumConfig&&cfg.summarizer){
|
|
3065
3208
|
try{
|
|
3066
3209
|
var sr=await fetch('/api/test-model',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({type:'summarizer',provider:cfg.summarizer.provider,model:cfg.summarizer.model||'',endpoint:cfg.summarizer.endpoint||'',apiKey:cfg.summarizer.apiKey||''})});
|
|
3210
|
+
if(sr.status===401){done();toast(t('settings.session.expired'),'error');return;}
|
|
3067
3211
|
var sd=await sr.json();
|
|
3068
3212
|
if(!sd.ok){done();toast(t('settings.save.sum.fail')+': '+sd.error,'error');document.getElementById('testSumResult').className='test-result fail';document.getElementById('testSumResult').innerHTML='\\u274C '+sd.error;return;}
|
|
3069
3213
|
document.getElementById('testSumResult').className='test-result ok';document.getElementById('testSumResult').innerHTML='\\u2705 '+t('settings.test.ok');
|
|
@@ -3074,6 +3218,7 @@ async function saveConfig(){
|
|
|
3074
3218
|
if(hasSkillConfig&&cfg.skillEvolution.summarizer){
|
|
3075
3219
|
try{
|
|
3076
3220
|
var kr=await fetch('/api/test-model',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({type:'summarizer',provider:cfg.skillEvolution.summarizer.provider,model:cfg.skillEvolution.summarizer.model||'',endpoint:cfg.skillEvolution.summarizer.endpoint||'',apiKey:cfg.skillEvolution.summarizer.apiKey||''})});
|
|
3221
|
+
if(kr.status===401){done();toast(t('settings.session.expired'),'error');return;}
|
|
3077
3222
|
var kd=await kr.json();
|
|
3078
3223
|
if(!kd.ok){done();toast(t('settings.save.skill.fail')+': '+kd.error,'error');document.getElementById('testSkillResult').className='test-result fail';document.getElementById('testSkillResult').innerHTML='\\u274C '+kd.error;return;}
|
|
3079
3224
|
document.getElementById('testSkillResult').className='test-result ok';document.getElementById('testSkillResult').innerHTML='\\u2705 '+t('settings.test.ok');
|
|
@@ -3131,6 +3276,7 @@ async function testModel(type){
|
|
|
3131
3276
|
try{
|
|
3132
3277
|
var body={type:type,provider:provider,model:model,endpoint:endpoint,apiKey:apiKey};
|
|
3133
3278
|
var r=await fetch('/api/test-model',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(body)});
|
|
3279
|
+
if(r.status===401){resultEl.className='test-result fail';resultEl.innerHTML='\\u274C '+t('settings.session.expired');btn.disabled=false;return;}
|
|
3134
3280
|
var d=await r.json();
|
|
3135
3281
|
if(d.ok){
|
|
3136
3282
|
resultEl.className='test-result ok';
|
|
@@ -3455,17 +3601,6 @@ function renderToolAgg(data){
|
|
|
3455
3601
|
'</tbody></table>';
|
|
3456
3602
|
}
|
|
3457
3603
|
|
|
3458
|
-
function renderBreakdown(obj,containerId){
|
|
3459
|
-
const el=document.getElementById(containerId);
|
|
3460
|
-
if(!el)return;
|
|
3461
|
-
const entries=Object.entries(obj||{}).sort((a,b)=>b[1]-a[1]);
|
|
3462
|
-
const total=entries.reduce((s,[,v])=>s+v,0)||1;
|
|
3463
|
-
el.innerHTML=entries.map(([label,value])=>{
|
|
3464
|
-
const pct=Math.round((value/total)*100);
|
|
3465
|
-
return '<div class="breakdown-item"><div class="bd-top"><span class="label">'+esc(label)+'</span><span class="value">'+value+' <span style="font-size:11px;font-weight:500;color:var(--text-muted)">('+pct+'%)</span></span></div><div class="breakdown-bar-wrap"><div class="breakdown-bar" style="width:'+pct+'%"></div></div></div>';
|
|
3466
|
-
}).join('');
|
|
3467
|
-
}
|
|
3468
|
-
|
|
3469
3604
|
/* ─── Data loading ─── */
|
|
3470
3605
|
async function loadAll(){
|
|
3471
3606
|
await Promise.all([loadStats(),loadMemories()]);
|
|
@@ -3548,8 +3683,6 @@ function getFilterParams(){
|
|
|
3548
3683
|
const p=new URLSearchParams();
|
|
3549
3684
|
if(activeSession) p.set('session',activeSession);
|
|
3550
3685
|
if(activeRole) p.set('role',activeRole);
|
|
3551
|
-
const kind=document.getElementById('filterKind').value;
|
|
3552
|
-
if(kind) p.set('kind',kind);
|
|
3553
3686
|
const df=document.getElementById('dateFrom').value;
|
|
3554
3687
|
if(df) p.set('dateFrom',df);
|
|
3555
3688
|
const dt=document.getElementById('dateTo').value;
|
|
@@ -3653,18 +3786,19 @@ function renderMemories(items){
|
|
|
3653
3786
|
list.innerHTML=items.map(m=>{
|
|
3654
3787
|
const time=m.created_at?new Date(typeof m.created_at==='number'?m.created_at:m.created_at).toLocaleString('zh-CN'):'';
|
|
3655
3788
|
const role=m.role||'user';
|
|
3656
|
-
const
|
|
3657
|
-
const
|
|
3658
|
-
const content=esc(
|
|
3789
|
+
const rawSummary=m.summary||'';
|
|
3790
|
+
const rawContent=m.content||'';
|
|
3791
|
+
const content=esc(rawContent);
|
|
3659
3792
|
const id=m.id;
|
|
3660
3793
|
const vscore=m._vscore?'<span class="vscore-badge">'+Math.round(m._vscore*100)+'%</span>':'';
|
|
3661
3794
|
const sid=m.session_key||'';
|
|
3662
3795
|
const sidShort=sid.length>18?sid.slice(0,6)+'..'+sid.slice(-6):sid;
|
|
3663
3796
|
const mc=m.merge_count||0;
|
|
3797
|
+
const cardTitle=esc(rawSummary||rawContent||'');
|
|
3664
3798
|
const mergeBadge=mc>0?'<span class="merge-badge">\\u{1F504} '+t('card.evolved')+' '+mc+t('card.times')+'</span>':'';
|
|
3665
3799
|
const updatedAt=(m.updated_at&&m.updated_at>m.created_at)?'<span class="card-updated">'+t('card.updated')+' '+new Date(m.updated_at).toLocaleString('zh-CN')+'</span>':'';
|
|
3666
3800
|
const ds=m.dedup_status||'active';
|
|
3667
|
-
const isInactive=ds==='
|
|
3801
|
+
const isInactive=ds==='merged';
|
|
3668
3802
|
const dedupBadge=ds==='duplicate'?'<span class="dedup-badge duplicate">'+t('card.dedupDuplicate')+'</span>':ds==='merged'?'<span class="dedup-badge merged">'+t('card.dedupMerged')+'</span>':'';
|
|
3669
3803
|
const isImported=sid.startsWith('openclaw-import-')||sid.startsWith('openclaw-session-');
|
|
3670
3804
|
const importBadge=isImported?'<span class="import-badge">\u{1F990} '+t('card.imported')+'</span>':'';
|
|
@@ -3672,7 +3806,7 @@ function renderMemories(items){
|
|
|
3672
3806
|
const isPublicMem=ownerVal==='public';
|
|
3673
3807
|
const ownerBadge=isPublicMem?'<span class="owner-badge public">\\u{1F310} '+t('filter.public')+'</span>':'<span class="owner-badge agent">\\u{1F512} '+t('filter.private')+'</span>';
|
|
3674
3808
|
let dedupInfo='';
|
|
3675
|
-
if(
|
|
3809
|
+
if(ds==='duplicate'||ds==='merged'){
|
|
3676
3810
|
const reason=m.dedup_reason?'<span style="font-size:11px;color:var(--text-muted)">'+t('card.dedupReason')+esc(m.dedup_reason)+'</span>':'';
|
|
3677
3811
|
const target=m.dedup_target?'<span class="dedup-target-link" onclick="scrollToMemory(\\''+m.dedup_target+'\\')">'+t('card.dedupTarget')+m.dedup_target.slice(0,8)+'...</span>':'';
|
|
3678
3812
|
dedupInfo='<div style="margin-top:6px;font-size:11px">'+target+' '+reason+'</div>';
|
|
@@ -3695,8 +3829,23 @@ function renderMemories(items){
|
|
|
3695
3829
|
}catch(e){}
|
|
3696
3830
|
}
|
|
3697
3831
|
return '<div class="memory-card'+(isInactive?' dedup-inactive':'')+'">'+
|
|
3698
|
-
'<div class="card-header"><div class="meta"><span class="role-tag '+role+'">'+role+'</span
|
|
3699
|
-
'<div class="card-summary">'+
|
|
3832
|
+
'<div class="card-header"><div class="meta"><span class="role-tag '+role+'">'+role+'</span>'+ownerBadge+importBadge+dedupBadge+mergeBadge+'</div><span class="card-time"><span class="session-tag" title="'+esc(sid)+'">'+esc(sidShort)+'</span> '+time+updatedAt+'</span></div>'+
|
|
3833
|
+
'<div class="card-summary">'+cardTitle+'</div>'+
|
|
3834
|
+
(function(){
|
|
3835
|
+
if(mc<=0) return '';
|
|
3836
|
+
var mergeHtml='<div class="card-merged-info">';
|
|
3837
|
+
mergeHtml+='<div class="card-merged-label">\\u{1F504} '+t('card.mergedInfo')+' ('+mc+t('card.times')+')</div>';
|
|
3838
|
+
var sources=m.merge_sources||[];
|
|
3839
|
+
if(sources.length>0){
|
|
3840
|
+
mergeHtml+='<div style="display:flex;flex-wrap:wrap;gap:6px">';
|
|
3841
|
+
sources.forEach(function(s){
|
|
3842
|
+
mergeHtml+='<span class="dedup-target-link" onclick="scrollToMemory(\\''+s.id+'\\')">\\u{1F517} '+s.id.slice(0,8)+'...</span>';
|
|
3843
|
+
});
|
|
3844
|
+
mergeHtml+='</div>';
|
|
3845
|
+
}
|
|
3846
|
+
mergeHtml+='</div>';
|
|
3847
|
+
return mergeHtml;
|
|
3848
|
+
})()+
|
|
3700
3849
|
dedupInfo+
|
|
3701
3850
|
'<div class="card-content" id="content-'+id+'"><pre>'+content+'</pre></div>'+
|
|
3702
3851
|
historyHtml+
|
|
@@ -3775,12 +3924,11 @@ async function showMemoryModal(chunkId){
|
|
|
3775
3924
|
const m=data.memory;
|
|
3776
3925
|
const role=(m.role||'unknown').toUpperCase();
|
|
3777
3926
|
const roleCls=(m.role||'').toLowerCase();
|
|
3778
|
-
const kind=m.kind||'paragraph';
|
|
3779
3927
|
const ds=m.dedup_status||'active';
|
|
3780
3928
|
const time=new Date(m.created_at).toLocaleString('zh-CN');
|
|
3781
3929
|
const updated=m.updated_at?new Date(m.updated_at).toLocaleString('zh-CN'):'';
|
|
3782
3930
|
let html='<div class="modal-memory-card">';
|
|
3783
|
-
html+='<div class="modal-header-row"><span class="role-tag '+roleCls+'">'+role+'</span
|
|
3931
|
+
html+='<div class="modal-header-row"><span class="role-tag '+roleCls+'">'+role+'</span>';
|
|
3784
3932
|
if(ds!=='active') html+='<span class="dedup-badge '+(ds==='duplicate'?'duplicate':'merged')+'">'+ds+'</span>';
|
|
3785
3933
|
html+='</div>';
|
|
3786
3934
|
html+='<div class="modal-field"><div class="modal-field-label">ID</div><div class="modal-field-val" style="font-family:monospace;font-size:11px">'+esc(m.id)+'</div></div>';
|
|
@@ -3838,17 +3986,6 @@ function renderSummaryHtml(raw){
|
|
|
3838
3986
|
}
|
|
3839
3987
|
|
|
3840
3988
|
/* ─── CRUD ─── */
|
|
3841
|
-
function openCreateModal(){
|
|
3842
|
-
editingId=null;
|
|
3843
|
-
document.getElementById('modalTitle').textContent=t('modal.new');
|
|
3844
|
-
document.getElementById('modalSubmit').textContent=t('modal.create');
|
|
3845
|
-
document.getElementById('mRole').value='user';
|
|
3846
|
-
document.getElementById('mContent').value='';
|
|
3847
|
-
document.getElementById('mSummary').value='';
|
|
3848
|
-
document.getElementById('mKind').value='paragraph';
|
|
3849
|
-
document.getElementById('modalOverlay').classList.add('show');
|
|
3850
|
-
}
|
|
3851
|
-
|
|
3852
3989
|
function openEditModal(id){
|
|
3853
3990
|
const m=memoryCache[id];
|
|
3854
3991
|
if(!m){toast(t('toast.notfound'),'error');return}
|
|
@@ -3858,7 +3995,6 @@ function openEditModal(id){
|
|
|
3858
3995
|
document.getElementById('mRole').value=m.role||'user';
|
|
3859
3996
|
document.getElementById('mContent').value=m.content||'';
|
|
3860
3997
|
document.getElementById('mSummary').value=m.summary||'';
|
|
3861
|
-
document.getElementById('mKind').value=m.kind||'paragraph';
|
|
3862
3998
|
document.getElementById('modalOverlay').classList.add('show');
|
|
3863
3999
|
}
|
|
3864
4000
|
|
|
@@ -3867,21 +4003,16 @@ function closeModal(){
|
|
|
3867
4003
|
}
|
|
3868
4004
|
|
|
3869
4005
|
async function submitModal(){
|
|
4006
|
+
if(!editingId)return;
|
|
3870
4007
|
const data={
|
|
3871
4008
|
role:document.getElementById('mRole').value,
|
|
3872
4009
|
content:document.getElementById('mContent').value,
|
|
3873
4010
|
summary:document.getElementById('mSummary').value,
|
|
3874
|
-
kind:document.getElementById('mKind').value,
|
|
3875
4011
|
};
|
|
3876
4012
|
if(!data.content.trim()){toast(t('modal.err.empty'),'error');return}
|
|
3877
|
-
|
|
3878
|
-
if(editingId){
|
|
3879
|
-
r=await fetch('/api/memory/'+editingId,{method:'PUT',headers:{'Content-Type':'application/json'},body:JSON.stringify(data)});
|
|
3880
|
-
} else {
|
|
3881
|
-
r=await fetch('/api/memory',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(data)});
|
|
3882
|
-
}
|
|
4013
|
+
const r=await fetch('/api/memory/'+editingId,{method:'PUT',headers:{'Content-Type':'application/json'},body:JSON.stringify(data)});
|
|
3883
4014
|
const d=await r.json();
|
|
3884
|
-
if(d.ok){toast(
|
|
4015
|
+
if(d.ok){toast(t('toast.updated'),'success');closeModal();loadAll();}
|
|
3885
4016
|
else{toast(d.error||t('toast.opfail'),'error')}
|
|
3886
4017
|
}
|
|
3887
4018
|
|
|
@@ -3904,12 +4035,15 @@ async function toggleMemoryPublic(id,setPublic){
|
|
|
3904
4035
|
}
|
|
3905
4036
|
|
|
3906
4037
|
async function clearAll(){
|
|
3907
|
-
|
|
3908
|
-
|
|
3909
|
-
|
|
3910
|
-
|
|
3911
|
-
|
|
3912
|
-
|
|
4038
|
+
try{
|
|
4039
|
+
if(!confirm(t('confirm.clearall')))return;
|
|
4040
|
+
if(!confirm(t('confirm.clearall2')))return;
|
|
4041
|
+
const r=await fetch('/api/memories',{method:'DELETE'});
|
|
4042
|
+
if(r.status===401){toast(t('settings.session.expired'),'error');return;}
|
|
4043
|
+
const d=await r.json();
|
|
4044
|
+
if(d.ok){toast(t('toast.cleared'),'success');loadAll();}
|
|
4045
|
+
else{toast(t('toast.clearfail'),'error')}
|
|
4046
|
+
}catch(e){toast('Error: '+e.message,'error')}
|
|
3913
4047
|
}
|
|
3914
4048
|
|
|
3915
4049
|
/* ─── Migration ─── */
|
|
@@ -3929,7 +4063,7 @@ let migrateStats={stored:0,skipped:0,merged:0,errors:0};
|
|
|
3929
4063
|
});
|
|
3930
4064
|
})();
|
|
3931
4065
|
|
|
3932
|
-
async function migrateScan(){
|
|
4066
|
+
async function migrateScan(showToast){
|
|
3933
4067
|
const btn=document.getElementById('migrateScanBtn');
|
|
3934
4068
|
btn.disabled=true;
|
|
3935
4069
|
btn.textContent=t('migrate.scanning');
|
|
@@ -3962,9 +4096,31 @@ async function migrateScan(){
|
|
|
3962
4096
|
t('migrate.config.warn.desc')+' ('+parts.join(', ')+')';
|
|
3963
4097
|
}
|
|
3964
4098
|
|
|
4099
|
+
const imported=d.importedChunkCount||0;
|
|
4100
|
+
const remaining=Math.max(0,(d.totalItems||0)-imported);
|
|
4101
|
+
|
|
3965
4102
|
if(d.totalItems>0 && d.configReady){
|
|
3966
4103
|
document.getElementById('migrateStartBtn').style.display='inline-flex';
|
|
3967
4104
|
document.getElementById('migrateConcurrencyRow').style.display='inline-flex';
|
|
4105
|
+
if(d.hasImportedData){
|
|
4106
|
+
document.getElementById('migrateStartBtn').textContent=t('migrate.resume');
|
|
4107
|
+
}else{
|
|
4108
|
+
document.getElementById('migrateStartBtn').textContent=t('migrate.start');
|
|
4109
|
+
}
|
|
4110
|
+
}
|
|
4111
|
+
|
|
4112
|
+
var hintEl=document.getElementById('migrateImportedHint');
|
|
4113
|
+
if(!hintEl){
|
|
4114
|
+
hintEl=document.createElement('div');
|
|
4115
|
+
hintEl.id='migrateImportedHint';
|
|
4116
|
+
hintEl.style.cssText='font-size:12px;color:var(--text-sec);padding:6px 0';
|
|
4117
|
+
document.getElementById('migrateActions').appendChild(hintEl);
|
|
4118
|
+
}
|
|
4119
|
+
if(imported>0){
|
|
4120
|
+
hintEl.textContent=t('migrate.imported.hint').replace('{n}',imported);
|
|
4121
|
+
hintEl.style.display='block';
|
|
4122
|
+
}else{
|
|
4123
|
+
hintEl.style.display='none';
|
|
3968
4124
|
}
|
|
3969
4125
|
|
|
3970
4126
|
if(d.totalItems===0){
|
|
@@ -3974,6 +4130,7 @@ async function migrateScan(){
|
|
|
3974
4130
|
if(d.hasImportedData){
|
|
3975
4131
|
document.getElementById('postprocessSection').style.display='block';
|
|
3976
4132
|
}
|
|
4133
|
+
if(showToast) toast(t('migrate.scan.done').replace('{n}',remaining),'success');
|
|
3977
4134
|
}catch(e){
|
|
3978
4135
|
toast('Scan failed: '+e.message,'error');
|
|
3979
4136
|
}finally{
|
|
@@ -3983,27 +4140,36 @@ async function migrateScan(){
|
|
|
3983
4140
|
}
|
|
3984
4141
|
|
|
3985
4142
|
function migrateStart(){
|
|
3986
|
-
|
|
3987
|
-
if(!
|
|
4143
|
+
const isResume=document.getElementById('migrateStartBtn').textContent===t('migrate.resume');
|
|
4144
|
+
if(!isResume){
|
|
4145
|
+
if(!migrateScanData||!migrateScanData.configReady){
|
|
4146
|
+
toast(t('migrate.scan.required'),'error');
|
|
4147
|
+
return;
|
|
4148
|
+
}
|
|
4149
|
+
if(!confirm(t('migrate.start')+'?'))return;
|
|
4150
|
+
}
|
|
3988
4151
|
|
|
3989
4152
|
const concSel=document.getElementById('migrateConcurrency');
|
|
3990
4153
|
const concurrency=concSel?parseInt(concSel.value,10)||1:1;
|
|
3991
4154
|
|
|
3992
4155
|
window._migrateRunning=true;
|
|
3993
|
-
_migrateStatusChecked=
|
|
4156
|
+
_migrateStatusChecked=true;
|
|
3994
4157
|
document.getElementById('migrateStartBtn').style.display='none';
|
|
3995
4158
|
document.getElementById('migrateScanBtn').disabled=true;
|
|
4159
|
+
var hintEl=document.getElementById('migrateImportedHint');
|
|
4160
|
+
if(hintEl) hintEl.style.display='none';
|
|
3996
4161
|
document.getElementById('migrateConcurrencyRow').style.display='none';
|
|
3997
4162
|
document.getElementById('migrateConcurrencyWarn').style.display='none';
|
|
3998
4163
|
document.getElementById('migrateProgress').style.display='block';
|
|
3999
4164
|
document.getElementById('migrateLiveLog').innerHTML='';
|
|
4000
4165
|
migrateStats={stored:0,skipped:0,merged:0,errors:0};
|
|
4001
4166
|
updateMigrateStats();
|
|
4167
|
+
document.getElementById('migrateBar').style.width='0%';
|
|
4168
|
+
document.getElementById('migrateCounter').textContent='';
|
|
4002
4169
|
|
|
4003
4170
|
document.getElementById('migrateStopBtn').disabled=false;
|
|
4004
|
-
document.getElementById('
|
|
4171
|
+
document.getElementById('migrateStopBtn').style.display='inline-flex';
|
|
4005
4172
|
document.getElementById('migrateBar').style.background='linear-gradient(90deg,#6366f1,#8b5cf6)';
|
|
4006
|
-
document.getElementById('migrateCounter').textContent='';
|
|
4007
4173
|
const body=JSON.stringify({sources:['sqlite','sessions'],concurrency});
|
|
4008
4174
|
connectMigrateSSE('/api/migrate/start','POST',body);
|
|
4009
4175
|
}
|
|
@@ -4040,7 +4206,7 @@ function readSSEStream(r){
|
|
|
4040
4206
|
const NL=String.fromCharCode(10);
|
|
4041
4207
|
function pump(){
|
|
4042
4208
|
reader.read().then(({done,value})=>{
|
|
4043
|
-
if(done){if(!migrateDoneCalled
|
|
4209
|
+
if(done){if(!migrateDoneCalled)onMigrateDone(false);return;}
|
|
4044
4210
|
buf+=decoder.decode(value,{stream:true});
|
|
4045
4211
|
const lines=buf.split(NL);
|
|
4046
4212
|
buf=lines.pop()||'';
|
|
@@ -4063,7 +4229,7 @@ function readSSEStream(r){
|
|
|
4063
4229
|
|
|
4064
4230
|
var _migrateStatusChecked=false;
|
|
4065
4231
|
async function checkMigrateStatus(){
|
|
4066
|
-
if(_migrateStatusChecked) return;
|
|
4232
|
+
if(_migrateStatusChecked||window._migrateRunning) return;
|
|
4067
4233
|
_migrateStatusChecked=true;
|
|
4068
4234
|
try{
|
|
4069
4235
|
const r=await fetch('/api/migrate/status');
|
|
@@ -4085,7 +4251,18 @@ async function checkMigrateStatus(){
|
|
|
4085
4251
|
document.getElementById('migrateCounter').textContent=s.processed+' / '+s.total+' ('+pct+'%)';
|
|
4086
4252
|
const label=s.phase==='sqlite'?t('migrate.phase.sqlite'):t('migrate.phase.sessions');
|
|
4087
4253
|
document.getElementById('migratePhaseLabel').textContent=label;
|
|
4254
|
+
document.getElementById('migrateStopBtn').style.display='inline-flex';
|
|
4255
|
+
if(s.processed>0){
|
|
4256
|
+
const log=document.getElementById('migrateLiveLog');
|
|
4257
|
+
const hint=document.createElement('div');
|
|
4258
|
+
hint.style.cssText='text-align:center;padding:8px 12px;color:var(--text-muted);font-size:11px;border-bottom:1px solid var(--border)';
|
|
4259
|
+
hint.textContent=t('migrate.reconnect.hint').replace('{n}',s.processed);
|
|
4260
|
+
log.appendChild(hint);
|
|
4261
|
+
}
|
|
4088
4262
|
connectMigrateSSE('/api/migrate/stream','GET',null);
|
|
4263
|
+
fetch('/api/migrate/scan').then(function(sr){return sr.json()}).then(function(sd){
|
|
4264
|
+
if(sd&&sd.hasImportedData) document.getElementById('postprocessSection').style.display='block';
|
|
4265
|
+
}).catch(function(){});
|
|
4089
4266
|
}else if(s.done&&(s.stored>0||s.skipped>0||s.stopped)){
|
|
4090
4267
|
migrateStats={stored:s.stored,skipped:s.skipped,merged:s.merged,errors:s.errors};
|
|
4091
4268
|
updateMigrateStats();
|
|
@@ -4183,18 +4360,23 @@ function onMigrateDone(wasStopped,skipReload){
|
|
|
4183
4360
|
document.getElementById('migrateScanBtn').disabled=false;
|
|
4184
4361
|
document.getElementById('migrateStopBtn').disabled=true;
|
|
4185
4362
|
document.getElementById('migrateStopBtn').textContent=t('migrate.stop');
|
|
4363
|
+
document.getElementById('migrateStopBtn').style.display='none';
|
|
4186
4364
|
if(wasStopped){
|
|
4187
4365
|
document.getElementById('migrateBar').style.background='linear-gradient(90deg,#f59e0b,#fbbf24)';
|
|
4188
4366
|
document.getElementById('migrateStartBtn').style.display='inline-flex';
|
|
4189
4367
|
document.getElementById('migrateStartBtn').textContent=t('migrate.resume');
|
|
4368
|
+
document.getElementById('migratePhaseLabel').textContent=t('migrate.phase.stopped');
|
|
4190
4369
|
}else{
|
|
4191
4370
|
document.getElementById('migrateBar').style.width='100%';
|
|
4192
4371
|
document.getElementById('migrateBar').style.background='linear-gradient(90deg,#22c55e,#16a34a)';
|
|
4193
4372
|
const total=migrateStats.stored+migrateStats.skipped+migrateStats.merged+migrateStats.errors;
|
|
4194
4373
|
if(total>0) document.getElementById('migrateCounter').textContent=total+' / '+total+' (100%)';
|
|
4374
|
+
document.getElementById('migratePhaseLabel').textContent=t('migrate.phase.done');
|
|
4195
4375
|
}
|
|
4196
4376
|
fetch('/api/migrate/scan').then(r=>{if(!r.ok)throw new Error();return r.json()}).then(d=>{
|
|
4197
|
-
if(d&&d.hasImportedData)
|
|
4377
|
+
if(d&&d.hasImportedData){
|
|
4378
|
+
document.getElementById('postprocessSection').style.display='block';
|
|
4379
|
+
}
|
|
4198
4380
|
}).catch(()=>{});
|
|
4199
4381
|
if(!skipReload) loadAll();
|
|
4200
4382
|
}
|
|
@@ -4322,12 +4504,18 @@ function connectPPSSE(){
|
|
|
4322
4504
|
}).catch(function(){});
|
|
4323
4505
|
}else if(s.done){
|
|
4324
4506
|
document.getElementById('postprocessSection').style.display='block';
|
|
4325
|
-
ppStats={tasks:s.tasksCreated||0,skills:s.skillsCreated||0,errors:s.errors||0,skipped:0};
|
|
4507
|
+
ppStats={tasks:s.tasksCreated||0,skills:s.skillsCreated||0,errors:s.errors||0,skipped:s.skippedSessions||0};
|
|
4326
4508
|
updatePPStats();
|
|
4327
4509
|
document.getElementById('ppProgress').style.display='block';
|
|
4328
|
-
var
|
|
4329
|
-
|
|
4330
|
-
|
|
4510
|
+
var totalAll=(s.total||0)+(s.skippedSessions||0);
|
|
4511
|
+
if(totalAll>0){
|
|
4512
|
+
document.getElementById('ppBar').style.width='100%';
|
|
4513
|
+
document.getElementById('ppCounter').textContent=totalAll+' / '+totalAll+' (100%)';
|
|
4514
|
+
}else{
|
|
4515
|
+
var pct2=s.total>0?Math.round((s.processed/s.total)*100):0;
|
|
4516
|
+
document.getElementById('ppBar').style.width=pct2+'%';
|
|
4517
|
+
document.getElementById('ppCounter').textContent=s.processed+' / '+s.total+' ('+pct2+'%)';
|
|
4518
|
+
}
|
|
4331
4519
|
ppDone(!!s.stopped,false,true);
|
|
4332
4520
|
}
|
|
4333
4521
|
}).catch(function(){});
|
|
@@ -4335,9 +4523,11 @@ function connectPPSSE(){
|
|
|
4335
4523
|
|
|
4336
4524
|
function handlePPEvent(evtType,data){
|
|
4337
4525
|
if(evtType==='progress'){
|
|
4338
|
-
|
|
4339
|
-
|
|
4340
|
-
|
|
4526
|
+
if(data.total>0){
|
|
4527
|
+
var pct=Math.round((data.processed/data.total)*100);
|
|
4528
|
+
document.getElementById('ppBar').style.width=pct+'%';
|
|
4529
|
+
document.getElementById('ppCounter').textContent=data.processed+' / '+data.total+' ('+pct+'%)';
|
|
4530
|
+
}
|
|
4341
4531
|
}else if(evtType==='info'){
|
|
4342
4532
|
if(data.alreadyProcessed>0){
|
|
4343
4533
|
ppStats.skipped=data.alreadyProcessed;
|
|
@@ -4346,6 +4536,10 @@ function handlePPEvent(evtType,data){
|
|
|
4346
4536
|
}
|
|
4347
4537
|
if(data.pending===0){
|
|
4348
4538
|
appendPPLogItem({step:'done',session:t('pp.info.allDone'),index:'',total:''});
|
|
4539
|
+
document.getElementById('ppPhaseLabel').textContent=t('pp.info.allDone');
|
|
4540
|
+
document.getElementById('ppBar').style.width='100%';
|
|
4541
|
+
document.getElementById('ppBar').style.background='linear-gradient(90deg,#22c55e,#16a34a)';
|
|
4542
|
+
document.getElementById('ppCounter').textContent=data.alreadyProcessed+' / '+data.totalSessions;
|
|
4349
4543
|
}else{
|
|
4350
4544
|
document.getElementById('ppPhaseLabel').textContent=t('pp.info.pending').replace('{n}',data.pending);
|
|
4351
4545
|
}
|
|
@@ -4357,12 +4551,10 @@ function handlePPEvent(evtType,data){
|
|
|
4357
4551
|
document.getElementById('ppPhaseLabel').textContent=t('pp.running')+' — '+actionLabel+' — '+label;
|
|
4358
4552
|
}
|
|
4359
4553
|
if(data.step==='done'){
|
|
4360
|
-
if(data.action
|
|
4361
|
-
ppStats.skills++;
|
|
4362
|
-
}else{
|
|
4554
|
+
if(data.action!=='skill-only'){
|
|
4363
4555
|
ppStats.tasks++;
|
|
4556
|
+
updatePPStats();
|
|
4364
4557
|
}
|
|
4365
|
-
updatePPStats();
|
|
4366
4558
|
}else if(data.step==='error'){
|
|
4367
4559
|
ppStats.errors++;
|
|
4368
4560
|
updatePPStats();
|
|
@@ -4390,6 +4582,7 @@ function ppDone(wasStopped,wasFailed,skipReload){
|
|
|
4390
4582
|
document.getElementById('ppStopBtn').style.display='none';
|
|
4391
4583
|
document.getElementById('ppStartBtn').style.display='inline-flex';
|
|
4392
4584
|
document.getElementById('ppStartBtn').textContent=wasStopped?t('pp.resume'):t('pp.start');
|
|
4585
|
+
document.getElementById('ppStartBtn').disabled=false;
|
|
4393
4586
|
var doneEl=document.getElementById('ppDone');
|
|
4394
4587
|
doneEl.style.display='block';
|
|
4395
4588
|
if(wasFailed){
|
|
@@ -4397,17 +4590,38 @@ function ppDone(wasStopped,wasFailed,skipReload){
|
|
|
4397
4590
|
doneEl.style.color='#ef4444';
|
|
4398
4591
|
doneEl.textContent=t('pp.failed')||'Processing failed — check error above';
|
|
4399
4592
|
document.getElementById('ppBar').style.background='linear-gradient(90deg,#ef4444,#dc2626)';
|
|
4593
|
+
document.getElementById('ppPhaseLabel').textContent=t('pp.failed');
|
|
4400
4594
|
}else if(wasStopped){
|
|
4401
4595
|
doneEl.style.background='rgba(245,158,11,.06)';
|
|
4402
4596
|
doneEl.style.color='#f59e0b';
|
|
4403
4597
|
doneEl.textContent=t('pp.stopped');
|
|
4404
4598
|
document.getElementById('ppBar').style.background='linear-gradient(90deg,#f59e0b,#fbbf24)';
|
|
4599
|
+
document.getElementById('ppPhaseLabel').textContent=t('pp.stopped');
|
|
4405
4600
|
}else{
|
|
4406
4601
|
doneEl.style.background='rgba(34,197,94,.06)';
|
|
4407
4602
|
doneEl.style.color='#22c55e';
|
|
4408
|
-
doneEl.textContent=t('pp.done')+' ('+t('pp.stat.tasks')+': '+ppStats.tasks+', '+t('pp.stat.skills')+': '+ppStats.skills+')';
|
|
4409
4603
|
document.getElementById('ppBar').style.width='100%';
|
|
4410
4604
|
document.getElementById('ppBar').style.background='linear-gradient(90deg,#22c55e,#16a34a)';
|
|
4605
|
+
document.getElementById('ppPhaseLabel').textContent=t('pp.done');
|
|
4606
|
+
var ppTotal=ppStats.tasks+ppStats.skipped+ppStats.errors;
|
|
4607
|
+
if(ppTotal>0) document.getElementById('ppCounter').textContent=ppTotal+' / '+ppTotal+' (100%)';
|
|
4608
|
+
fetch('/api/migrate/postprocess/status').then(function(r){return r.json()}).then(function(st){
|
|
4609
|
+
var totalTasks=st.existingTasks||0;
|
|
4610
|
+
var totalSkills=st.existingSkills||0;
|
|
4611
|
+
var lines=[];
|
|
4612
|
+
if(ppStats.tasks>0) lines.push(t('pp.stat.tasks')+' +'+ppStats.tasks);
|
|
4613
|
+
if(ppStats.skills>0) lines.push(t('pp.stat.skills')+' +'+ppStats.skills);
|
|
4614
|
+
if(ppStats.skipped>0) lines.push(t('pp.stat.skipped')+': '+ppStats.skipped);
|
|
4615
|
+
var runText=lines.length>0?' ('+lines.join(', ')+')':'';
|
|
4616
|
+
var totalText=' — '+t('pp.stat.tasks')+' '+totalTasks+', '+t('pp.stat.skills.total')+' '+totalSkills;
|
|
4617
|
+
doneEl.textContent=t('pp.done')+runText+totalText;
|
|
4618
|
+
}).catch(function(){
|
|
4619
|
+
var parts=[];
|
|
4620
|
+
if(ppStats.tasks>0) parts.push(t('pp.stat.tasks')+': '+ppStats.tasks);
|
|
4621
|
+
if(ppStats.skills>0) parts.push(t('pp.stat.skills')+': '+ppStats.skills);
|
|
4622
|
+
if(ppStats.skipped>0) parts.push(t('pp.stat.skipped')+': '+ppStats.skipped);
|
|
4623
|
+
doneEl.textContent=t('pp.done')+(parts.length>0?' ('+parts.join(', ')+')':'');
|
|
4624
|
+
});
|
|
4411
4625
|
}
|
|
4412
4626
|
if(!skipReload) loadAll();
|
|
4413
4627
|
}
|
|
@@ -4445,16 +4659,64 @@ function toggleViewerTheme(){const el=document.documentElement;const cur=el.getA
|
|
|
4445
4659
|
initViewerTheme();
|
|
4446
4660
|
|
|
4447
4661
|
/* ─── Update check ─── */
|
|
4662
|
+
function waitForGatewayAndReload(maxAttempts,attempt){
|
|
4663
|
+
attempt=attempt||0;
|
|
4664
|
+
if(attempt>=maxAttempts){window.location.reload();return;}
|
|
4665
|
+
setTimeout(function(){
|
|
4666
|
+
fetch('/api/update-check').then(function(r){
|
|
4667
|
+
if(r.ok) window.location.reload();
|
|
4668
|
+
else waitForGatewayAndReload(maxAttempts,attempt+1);
|
|
4669
|
+
}).catch(function(){waitForGatewayAndReload(maxAttempts,attempt+1);});
|
|
4670
|
+
},3000);
|
|
4671
|
+
}
|
|
4672
|
+
function doUpdateInstall(packageSpec,btnEl){
|
|
4673
|
+
btnEl.disabled=true;
|
|
4674
|
+
btnEl.textContent=t('update.installing');
|
|
4675
|
+
fetch('/api/update-install',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({packageSpec:packageSpec})})
|
|
4676
|
+
.then(function(r){return r.json()})
|
|
4677
|
+
.then(function(d){
|
|
4678
|
+
if(d.ok){
|
|
4679
|
+
btnEl.textContent=t('update.success');
|
|
4680
|
+
btnEl.style.background='#22c55e';
|
|
4681
|
+
btnEl.style.color='#fff';
|
|
4682
|
+
waitForGatewayAndReload(20);
|
|
4683
|
+
}else{
|
|
4684
|
+
btnEl.textContent=t('update.failed')+': '+(d.error||'').slice(0,80);
|
|
4685
|
+
btnEl.style.background='#ef4444';
|
|
4686
|
+
btnEl.style.color='#fff';
|
|
4687
|
+
btnEl.disabled=false;
|
|
4688
|
+
setTimeout(function(){btnEl.textContent=t('update.btn');btnEl.style.background='';btnEl.style.color='';},5000);
|
|
4689
|
+
}
|
|
4690
|
+
})
|
|
4691
|
+
.catch(function(e){
|
|
4692
|
+
btnEl.textContent=t('update.failed');
|
|
4693
|
+
btnEl.disabled=false;
|
|
4694
|
+
setTimeout(function(){btnEl.textContent=t('update.btn');btnEl.style.background='';btnEl.style.color='';},5000);
|
|
4695
|
+
});
|
|
4696
|
+
}
|
|
4448
4697
|
async function checkForUpdate(){
|
|
4449
4698
|
try{
|
|
4450
4699
|
const r=await fetch('/api/update-check');
|
|
4451
4700
|
if(!r.ok)return;
|
|
4452
4701
|
const d=await r.json();
|
|
4453
4702
|
if(!d.updateAvailable)return;
|
|
4703
|
+
const pkgSpec=d.installCommand?d.installCommand.replace(/^openclaw plugins install\s+/,''):(d.packageName+'@'+d.latest);
|
|
4454
4704
|
const banner=document.createElement('div');
|
|
4455
4705
|
banner.id='updateBanner';
|
|
4456
4706
|
banner.style.cssText='position:fixed;top:0;left:0;right:0;z-index:9999;background:linear-gradient(135deg,#f59e0b,#d97706);color:#fff;padding:10px 20px;display:flex;align-items:center;justify-content:space-between;font-size:14px;box-shadow:0 2px 8px rgba(0,0,0,.25)';
|
|
4457
|
-
|
|
4707
|
+
var leftSpan=document.createElement('span');
|
|
4708
|
+
leftSpan.innerHTML='🔔 '+t('update.available')+': <b>v'+esc(d.current)+'</b> → <b>v'+esc(d.latest)+'</b>';
|
|
4709
|
+
var btnUpdate=document.createElement('button');
|
|
4710
|
+
btnUpdate.textContent=t('update.btn');
|
|
4711
|
+
btnUpdate.style.cssText='background:#fff;color:#d97706;border:none;padding:5px 16px;border-radius:6px;font-size:13px;font-weight:600;cursor:pointer;margin-left:12px';
|
|
4712
|
+
btnUpdate.onclick=function(){doUpdateInstall(pkgSpec,btnUpdate)};
|
|
4713
|
+
var btnClose=document.createElement('button');
|
|
4714
|
+
btnClose.innerHTML='×';
|
|
4715
|
+
btnClose.style.cssText='background:none;border:none;color:#fff;font-size:18px;cursor:pointer;padding:0 4px';
|
|
4716
|
+
btnClose.onclick=function(){banner.remove();document.body.style.paddingTop='';};
|
|
4717
|
+
leftSpan.appendChild(btnUpdate);
|
|
4718
|
+
banner.appendChild(leftSpan);
|
|
4719
|
+
banner.appendChild(btnClose);
|
|
4458
4720
|
document.body.prepend(banner);
|
|
4459
4721
|
document.body.style.paddingTop='48px';
|
|
4460
4722
|
}catch(e){}
|