@memtensor/memos-local-openclaw-plugin 0.2.1 → 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.
- package/README.md +4 -4
- package/dist/config.d.ts +3 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/skill/bundled-memory-guide.d.ts +1 -1
- package/dist/skill/bundled-memory-guide.d.ts.map +1 -1
- package/dist/skill/bundled-memory-guide.js +2 -2
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +10 -1
- package/dist/telemetry.js.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/viewer/html.d.ts +1 -1
- package/dist/viewer/html.d.ts.map +1 -1
- package/dist/viewer/html.js +17 -59
- package/dist/viewer/html.js.map +1 -1
- package/dist/viewer/server.d.ts.map +1 -1
- package/dist/viewer/server.js +34 -19
- package/dist/viewer/server.js.map +1 -1
- package/index.ts +73 -6
- package/openclaw.plugin.json +2 -1
- package/package.json +2 -2
- package/skill/memos-memory-guide/SKILL.md +2 -2
- package/src/config.ts +3 -3
- package/src/index.ts +5 -5
- package/src/skill/bundled-memory-guide.ts +2 -2
- package/src/telemetry.ts +9 -1
- package/src/types.ts +2 -2
- package/src/viewer/html.ts +17 -59
- package/src/viewer/server.ts +32 -18
package/src/viewer/html.ts
CHANGED
|
@@ -78,7 +78,8 @@ input,textarea,select{font-family:inherit;font-size:inherit}
|
|
|
78
78
|
/* ─── Auth (Linkify 配色: globals.css .dark + 蓝紫渐变) ─── */
|
|
79
79
|
.auth-screen{display:flex;align-items:center;justify-content:center;min-height:100vh;padding:20px;background:linear-gradient(135deg,rgb(36,0,255) 0%,rgb(0,135,255) 35%,rgb(108,39,157) 70%,rgb(105,30,255) 100%);position:relative;overflow:hidden}
|
|
80
80
|
.auth-card{background:hsl(0 0% 100%);border:none;border-radius:8px;padding:48px 40px;width:100%;max-width:420px;box-shadow:0 25px 50px -12px rgba(0,0,0,.25);text-align:center;position:relative;z-index:1}
|
|
81
|
-
.auth-card .logo{
|
|
81
|
+
.auth-card .logo{margin:0 auto 20px;text-align:center;line-height:0;background:none;border-radius:0}
|
|
82
|
+
.auth-card .logo svg{filter:drop-shadow(0 0 16px rgba(255,77,77,.35))}
|
|
82
83
|
.auth-card h1{font-size:22px;font-weight:700;margin-bottom:4px;color:hsl(0 0% 3.9%);letter-spacing:-.02em}
|
|
83
84
|
.auth-card p{color:hsl(0 0% 45.1%);margin-bottom:24px;font-size:14px}
|
|
84
85
|
.auth-card input{width:100%;padding:12px 16px;border:1px solid hsl(0 0% 89.8%);border-radius:8px;font-size:14px;transition:all .2s;margin-bottom:10px;outline:none;background:#fff;color:hsl(0 0% 3.9%)}
|
|
@@ -622,7 +623,7 @@ input,textarea,select{font-family:inherit;font-size:inherit}
|
|
|
622
623
|
<button class="auth-theme-toggle" onclick="toggleLang()" aria-label="Switch language"><span data-i18n="lang.switch">EN</span></button>
|
|
623
624
|
</div>
|
|
624
625
|
<div class="auth-card">
|
|
625
|
-
<div class="logo"
|
|
626
|
+
<div class="logo"><svg width="60" height="60" viewBox="0 0 120 120" fill="none" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="aLG" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="#ff4d4d"/><stop offset="100%" stop-color="#991b1b"/></linearGradient></defs><path d="M60 10C30 10 15 35 15 55C15 75 30 95 45 100L45 110L55 110L55 100C55 100 60 102 65 100L65 110L75 110L75 100C90 95 105 75 105 55C105 35 90 10 60 10Z" fill="url(#aLG)"/><path d="M20 45C5 40 0 50 5 60C10 70 20 65 25 55C28 48 25 45 20 45Z" fill="url(#aLG)"/><path d="M100 45C115 40 120 50 115 60C110 70 100 65 95 55C92 48 95 45 100 45Z" fill="url(#aLG)"/><path d="M45 15Q35 5 30 8" stroke="#ff4d4d" stroke-width="2" stroke-linecap="round"/><path d="M75 15Q85 5 90 8" stroke="#ff4d4d" stroke-width="2" stroke-linecap="round"/><circle cx="45" cy="35" r="6" fill="#050810"/><circle cx="75" cy="35" r="6" fill="#050810"/><circle cx="46" cy="34" r="2" fill="#00e5cc"/><circle cx="76" cy="34" r="2" fill="#00e5cc"/></svg></div>
|
|
626
627
|
<h1 data-i18n="title">OpenClaw Memory</h1>
|
|
627
628
|
<p style="font-size:12px;color:var(--text-sec);margin-bottom:6px" data-i18n="subtitle">Powered by MemOS</p>
|
|
628
629
|
<p data-i18n="setup.desc">Set a password to protect your memories</p>
|
|
@@ -640,7 +641,7 @@ input,textarea,select{font-family:inherit;font-size:inherit}
|
|
|
640
641
|
<button class="auth-theme-toggle" onclick="toggleLang()" aria-label="Switch language"><span data-i18n="lang.switch">EN</span></button>
|
|
641
642
|
</div>
|
|
642
643
|
<div class="auth-card">
|
|
643
|
-
<div class="logo"
|
|
644
|
+
<div class="logo"><svg width="60" height="60" viewBox="0 0 120 120" fill="none" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="bLG" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="#ff4d4d"/><stop offset="100%" stop-color="#991b1b"/></linearGradient></defs><path d="M60 10C30 10 15 35 15 55C15 75 30 95 45 100L45 110L55 110L55 100C55 100 60 102 65 100L65 110L75 110L75 100C90 95 105 75 105 55C105 35 90 10 60 10Z" fill="url(#bLG)"/><path d="M20 45C5 40 0 50 5 60C10 70 20 65 25 55C28 48 25 45 20 45Z" fill="url(#bLG)"/><path d="M100 45C115 40 120 50 115 60C110 70 100 65 95 55C92 48 95 45 100 45Z" fill="url(#bLG)"/><path d="M45 15Q35 5 30 8" stroke="#ff4d4d" stroke-width="2" stroke-linecap="round"/><path d="M75 15Q85 5 90 8" stroke="#ff4d4d" stroke-width="2" stroke-linecap="round"/><circle cx="45" cy="35" r="6" fill="#050810"/><circle cx="75" cy="35" r="6" fill="#050810"/><circle cx="46" cy="34" r="2" fill="#00e5cc"/><circle cx="76" cy="34" r="2" fill="#00e5cc"/></svg></div>
|
|
644
645
|
<h1 data-i18n="title">OpenClaw Memory</h1>
|
|
645
646
|
<p style="font-size:12px;color:var(--text-sec);margin-bottom:6px" data-i18n="subtitle">Powered by MemOS</p>
|
|
646
647
|
<p data-i18n="login.desc">Enter your password to access memories</p>
|
|
@@ -692,7 +693,7 @@ input,textarea,select{font-family:inherit;font-size:inherit}
|
|
|
692
693
|
<div class="app" id="app">
|
|
693
694
|
<div class="topbar">
|
|
694
695
|
<div class="brand">
|
|
695
|
-
<div class="icon"
|
|
696
|
+
<div class="icon"><svg width="24" height="24" viewBox="0 0 120 120" fill="none" xmlns="http://www.w3.org/2000/svg" style="filter:drop-shadow(0 0 8px rgba(255,77,77,.3))"><defs><linearGradient id="tLG" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="#ff4d4d"/><stop offset="100%" stop-color="#991b1b"/></linearGradient></defs><path d="M60 10C30 10 15 35 15 55C15 75 30 95 45 100L45 110L55 110L55 100C55 100 60 102 65 100L65 110L75 110L75 100C90 95 105 75 105 55C105 35 90 10 60 10Z" fill="url(#tLG)"/><path d="M20 45C5 40 0 50 5 60C10 70 20 65 25 55C28 48 25 45 20 45Z" fill="url(#tLG)"/><path d="M100 45C115 40 120 50 115 60C110 70 100 65 95 55C92 48 95 45 100 45Z" fill="url(#tLG)"/><path d="M45 15Q35 5 30 8" stroke="#ff4d4d" stroke-width="2" stroke-linecap="round"/><path d="M75 15Q85 5 90 8" stroke="#ff4d4d" stroke-width="2" stroke-linecap="round"/><circle cx="45" cy="35" r="6" fill="#050810"/><circle cx="75" cy="35" r="6" fill="#050810"/><circle cx="46" cy="34" r="2" fill="#00e5cc"/><circle cx="76" cy="34" r="2" fill="#00e5cc"/></svg></div>
|
|
696
697
|
<span data-i18n="title">OpenClaw Memory</span>
|
|
697
698
|
</div>
|
|
698
699
|
<div class="topbar-center">
|
|
@@ -890,7 +891,7 @@ input,textarea,select{font-family:inherit;font-size:inherit}
|
|
|
890
891
|
<button class="btn btn-sm btn-ghost" onclick="loadLogs()" style="font-size:12px">\u21BB <span data-i18n="logs.refresh">Refresh</span></button>
|
|
891
892
|
</div>
|
|
892
893
|
<div class="logs-toolbar-right">
|
|
893
|
-
<input type="checkbox" id="logAutoRefresh"
|
|
894
|
+
<input type="checkbox" id="logAutoRefresh" style="display:none">
|
|
894
895
|
</div>
|
|
895
896
|
</div>
|
|
896
897
|
<div class="logs-list" id="logsList"></div>
|
|
@@ -1162,13 +1163,6 @@ input,textarea,select{font-family:inherit;font-size:inherit}
|
|
|
1162
1163
|
</div>
|
|
1163
1164
|
</div>
|
|
1164
1165
|
|
|
1165
|
-
<!-- Done Summary -->
|
|
1166
|
-
<div id="migrateDone" style="display:none">
|
|
1167
|
-
<div class="settings-section" style="background:rgba(34,197,94,.04);border:1px solid rgba(34,197,94,.2)">
|
|
1168
|
-
<div style="font-size:14px;font-weight:700;color:#22c55e;margin-bottom:8px">\u2705 <span data-i18n="migrate.done">Import Complete</span></div>
|
|
1169
|
-
<div id="migrateDoneSummary" style="font-size:12px;color:var(--text-sec);line-height:1.6"></div>
|
|
1170
|
-
</div>
|
|
1171
|
-
</div>
|
|
1172
1166
|
</div>
|
|
1173
1167
|
|
|
1174
1168
|
</div>
|
|
@@ -1390,8 +1384,6 @@ const I18N={
|
|
|
1390
1384
|
'migrate.stat.skipped':'Skipped',
|
|
1391
1385
|
'migrate.stat.merged':'Merged',
|
|
1392
1386
|
'migrate.stat.errors':'Errors',
|
|
1393
|
-
'migrate.done':'Import Complete',
|
|
1394
|
-
'migrate.done.summary':'Processed {total} items: {stored} stored, {skipped} skipped, {merged} merged, {errors} errors.',
|
|
1395
1387
|
'migrate.phase.sqlite':'Importing memory index...',
|
|
1396
1388
|
'migrate.phase.sessions':'Importing conversation history...',
|
|
1397
1389
|
'migrate.chunks':'chunks',
|
|
@@ -1401,10 +1393,7 @@ const I18N={
|
|
|
1401
1393
|
'migrate.error.running':'A migration is already in progress.',
|
|
1402
1394
|
'migrate.stop':'\\u25A0 Stop',
|
|
1403
1395
|
'migrate.stopping':'Stopping...',
|
|
1404
|
-
'migrate.stopped':'Import Stopped',
|
|
1405
|
-
'migrate.stopped.hint':'Import was stopped. You can resume anytime — already imported items will be skipped automatically.',
|
|
1406
1396
|
'migrate.resume':'Continue Import',
|
|
1407
|
-
'migrate.already.hint':'All data has been imported previously. No new items to process.',
|
|
1408
1397
|
'pp.title':'\\u{1F9E0} Optional: Generate Tasks & Skills',
|
|
1409
1398
|
'pp.desc':'This step is completely optional. The import above has already stored raw memory data. Here you can further analyze imported conversations to generate structured task summaries and evolve reusable skills. Processing is serial (one session at a time) and may take a while. You can stop at any time and resume later — it will only process sessions not yet handled.',
|
|
1410
1399
|
'pp.tasks.label':'Generate task summaries',
|
|
@@ -1654,8 +1643,6 @@ const I18N={
|
|
|
1654
1643
|
'migrate.stat.skipped':'已跳过',
|
|
1655
1644
|
'migrate.stat.merged':'已合并',
|
|
1656
1645
|
'migrate.stat.errors':'错误',
|
|
1657
|
-
'migrate.done':'导入完成',
|
|
1658
|
-
'migrate.done.summary':'共处理 {total} 条:{stored} 条存储,{skipped} 条跳过,{merged} 条合并,{errors} 条错误。',
|
|
1659
1646
|
'migrate.phase.sqlite':'正在导入记忆索引...',
|
|
1660
1647
|
'migrate.phase.sessions':'正在导入对话历史...',
|
|
1661
1648
|
'migrate.chunks':'条记忆',
|
|
@@ -1665,10 +1652,7 @@ const I18N={
|
|
|
1665
1652
|
'migrate.error.running':'已有迁移任务正在进行。',
|
|
1666
1653
|
'migrate.stop':'\\u25A0 停止',
|
|
1667
1654
|
'migrate.stopping':'正在停止...',
|
|
1668
|
-
'migrate.stopped':'导入已停止',
|
|
1669
|
-
'migrate.stopped.hint':'导入已停止。你可以随时继续——已导入的内容会自动跳过。',
|
|
1670
1655
|
'migrate.resume':'继续导入',
|
|
1671
|
-
'migrate.already.hint':'所有数据已在之前导入过,没有新内容需要处理。',
|
|
1672
1656
|
'pp.title':'\\u{1F9E0} 可选:生成任务与技能',
|
|
1673
1657
|
'pp.desc':'此步骤完全可选。上面的导入已经存储了原始记忆数据。在这里可以进一步分析已导入的对话,生成结构化的任务摘要或进化可复用的技能。处理过程是串行的(逐个会话),可能需要较长时间。你可以随时停止,下次继续时只会处理尚未完成的会话。',
|
|
1674
1658
|
'pp.tasks.label':'生成任务摘要',
|
|
@@ -3210,7 +3194,6 @@ async function migrateScan(){
|
|
|
3210
3194
|
document.getElementById('migrateScanResult').style.display='none';
|
|
3211
3195
|
document.getElementById('migrateConfigWarn').style.display='none';
|
|
3212
3196
|
document.getElementById('migrateProgress').style.display='none';
|
|
3213
|
-
document.getElementById('migrateDone').style.display='none';
|
|
3214
3197
|
|
|
3215
3198
|
try{
|
|
3216
3199
|
const r=await fetch('/api/migrate/scan');
|
|
@@ -3261,13 +3244,14 @@ function migrateStart(){
|
|
|
3261
3244
|
document.getElementById('migrateStartBtn').style.display='none';
|
|
3262
3245
|
document.getElementById('migrateScanBtn').disabled=true;
|
|
3263
3246
|
document.getElementById('migrateProgress').style.display='block';
|
|
3264
|
-
document.getElementById('migrateDone').style.display='none';
|
|
3265
3247
|
document.getElementById('migrateLiveLog').innerHTML='';
|
|
3266
3248
|
migrateStats={stored:0,skipped:0,merged:0,errors:0};
|
|
3267
3249
|
updateMigrateStats();
|
|
3268
3250
|
|
|
3269
3251
|
document.getElementById('migrateStopBtn').disabled=false;
|
|
3252
|
+
document.getElementById('migrateBar').style.width='0%';
|
|
3270
3253
|
document.getElementById('migrateBar').style.background='linear-gradient(90deg,#6366f1,#8b5cf6)';
|
|
3254
|
+
document.getElementById('migrateCounter').textContent='';
|
|
3271
3255
|
const body=JSON.stringify({sources:['sqlite','sessions']});
|
|
3272
3256
|
connectMigrateSSE('/api/migrate/start','POST',body);
|
|
3273
3257
|
}
|
|
@@ -3304,7 +3288,7 @@ function readSSEStream(r){
|
|
|
3304
3288
|
const NL=String.fromCharCode(10);
|
|
3305
3289
|
function pump(){
|
|
3306
3290
|
reader.read().then(({done,value})=>{
|
|
3307
|
-
if(done){if(!migrateDoneCalled)onMigrateDone(false);return;}
|
|
3291
|
+
if(done){if(!migrateDoneCalled&&!window._migrateRunning)onMigrateDone(false);return;}
|
|
3308
3292
|
buf+=decoder.decode(value,{stream:true});
|
|
3309
3293
|
const lines=buf.split(NL);
|
|
3310
3294
|
buf=lines.pop()||'';
|
|
@@ -3338,7 +3322,9 @@ async function checkMigrateStatus(){
|
|
|
3338
3322
|
switchView('import');
|
|
3339
3323
|
migrateStats={stored:s.stored,skipped:s.skipped,merged:s.merged,errors:s.errors};
|
|
3340
3324
|
updateMigrateStats();
|
|
3341
|
-
document.getElementById('migrateProgress')
|
|
3325
|
+
const progEl=document.getElementById('migrateProgress');
|
|
3326
|
+
if(!progEl)return;
|
|
3327
|
+
progEl.style.display='block';
|
|
3342
3328
|
document.getElementById('migrateStartBtn').style.display='none';
|
|
3343
3329
|
document.getElementById('migrateScanBtn').disabled=true;
|
|
3344
3330
|
document.getElementById('migrateStopBtn').disabled=false;
|
|
@@ -3351,7 +3337,9 @@ async function checkMigrateStatus(){
|
|
|
3351
3337
|
}else if(s.done&&(s.stored>0||s.skipped>0||s.stopped)){
|
|
3352
3338
|
migrateStats={stored:s.stored,skipped:s.skipped,merged:s.merged,errors:s.errors};
|
|
3353
3339
|
updateMigrateStats();
|
|
3354
|
-
document.getElementById('migrateProgress')
|
|
3340
|
+
const progEl=document.getElementById('migrateProgress');
|
|
3341
|
+
if(!progEl)return;
|
|
3342
|
+
progEl.style.display='block';
|
|
3355
3343
|
const pct=s.total>0?Math.round((s.processed/s.total)*100):0;
|
|
3356
3344
|
document.getElementById('migrateBar').style.width=pct+'%';
|
|
3357
3345
|
document.getElementById('migrateCounter').textContent=s.processed+' / '+s.total+' ('+pct+'%)';
|
|
@@ -3441,43 +3429,13 @@ function onMigrateDone(wasStopped,skipReload){
|
|
|
3441
3429
|
document.getElementById('migrateScanBtn').disabled=false;
|
|
3442
3430
|
document.getElementById('migrateStopBtn').disabled=true;
|
|
3443
3431
|
document.getElementById('migrateStopBtn').textContent=t('migrate.stop');
|
|
3444
|
-
const doneEl=document.getElementById('migrateDone');
|
|
3445
|
-
doneEl.style.display='block';
|
|
3446
|
-
const total=migrateStats.stored+migrateStats.skipped+migrateStats.merged+migrateStats.errors;
|
|
3447
|
-
const allSkipped=migrateStats.stored===0&&migrateStats.merged===0&&migrateStats.skipped>0&&migrateStats.errors===0;
|
|
3448
|
-
const tmpl=t('migrate.done.summary');
|
|
3449
|
-
let summaryText=tmpl
|
|
3450
|
-
.replace('{total}',total)
|
|
3451
|
-
.replace('{stored}',migrateStats.stored)
|
|
3452
|
-
.replace('{skipped}',migrateStats.skipped)
|
|
3453
|
-
.replace('{merged}',migrateStats.merged)
|
|
3454
|
-
.replace('{errors}',migrateStats.errors);
|
|
3455
3432
|
if(wasStopped){
|
|
3456
|
-
|
|
3457
|
-
doneEl.querySelector('.settings-section').style.background='rgba(245,158,11,.04)';
|
|
3458
|
-
doneEl.querySelector('.settings-section').style.borderColor='rgba(245,158,11,.2)';
|
|
3459
|
-
doneEl.querySelector('div div:first-child').innerHTML='\u23F8 <span>'+t('migrate.stopped')+'</span>';
|
|
3460
|
-
doneEl.querySelector('div div:first-child').style.color='#f59e0b';
|
|
3433
|
+
document.getElementById('migrateBar').style.background='linear-gradient(90deg,#f59e0b,#fbbf24)';
|
|
3461
3434
|
document.getElementById('migrateStartBtn').style.display='inline-flex';
|
|
3462
3435
|
document.getElementById('migrateStartBtn').textContent=t('migrate.resume');
|
|
3463
|
-
}else if(allSkipped){
|
|
3464
|
-
summaryText+=' '+t('migrate.already.hint');
|
|
3465
|
-
doneEl.querySelector('.settings-section').style.background='rgba(59,130,246,.04)';
|
|
3466
|
-
doneEl.querySelector('.settings-section').style.borderColor='rgba(59,130,246,.2)';
|
|
3467
|
-
doneEl.querySelector('div div:first-child').innerHTML='\u{1F4AD} <span>'+t('migrate.done')+'</span>';
|
|
3468
|
-
doneEl.querySelector('div div:first-child').style.color='#3b82f6';
|
|
3469
3436
|
}else{
|
|
3470
|
-
doneEl.querySelector('.settings-section').style.background='rgba(34,197,94,.04)';
|
|
3471
|
-
doneEl.querySelector('.settings-section').style.borderColor='rgba(34,197,94,.2)';
|
|
3472
|
-
doneEl.querySelector('div div:first-child').innerHTML='\u2705 <span>'+t('migrate.done')+'</span>';
|
|
3473
|
-
doneEl.querySelector('div div:first-child').style.color='#22c55e';
|
|
3474
|
-
}
|
|
3475
|
-
document.getElementById('migrateDoneSummary').textContent=summaryText;
|
|
3476
|
-
if(!wasStopped){
|
|
3477
3437
|
document.getElementById('migrateBar').style.width='100%';
|
|
3478
|
-
document.getElementById('migrateBar').style.background=
|
|
3479
|
-
}else{
|
|
3480
|
-
document.getElementById('migrateBar').style.background='linear-gradient(90deg,#f59e0b,#fbbf24)';
|
|
3438
|
+
document.getElementById('migrateBar').style.background='linear-gradient(90deg,#22c55e,#16a34a)';
|
|
3481
3439
|
}
|
|
3482
3440
|
fetch('/api/migrate/scan').then(r=>r.json()).then(d=>{
|
|
3483
3441
|
if(d.hasImportedData) document.getElementById('postprocessSection').style.display='block';
|
package/src/viewer/server.ts
CHANGED
|
@@ -129,7 +129,7 @@ export class ViewerServer {
|
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
private hashPassword(pw: string): string {
|
|
132
|
-
return crypto.createHash("sha256").update(pw + "memos-
|
|
132
|
+
return crypto.createHash("sha256").update(pw + "memos-lite-salt-2026").digest("hex");
|
|
133
133
|
}
|
|
134
134
|
|
|
135
135
|
private createSession(): string {
|
|
@@ -770,11 +770,18 @@ export class ViewerServer {
|
|
|
770
770
|
return;
|
|
771
771
|
}
|
|
772
772
|
const raw = JSON.parse(fs.readFileSync(cfgPath, "utf-8"));
|
|
773
|
-
const
|
|
773
|
+
const entries = raw?.plugins?.entries ?? {};
|
|
774
|
+
const pluginEntry = entries["memos-local-openclaw-plugin"]?.config
|
|
775
|
+
?? entries["memos-lite-openclaw-plugin"]?.config
|
|
776
|
+
?? entries["memos-lite"]?.config
|
|
777
|
+
?? {};
|
|
774
778
|
const result: Record<string, unknown> = { ...pluginEntry };
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
779
|
+
const topEntry = entries["memos-local-openclaw-plugin"]
|
|
780
|
+
?? entries["memos-lite-openclaw-plugin"]
|
|
781
|
+
?? entries["memos-lite"]
|
|
782
|
+
?? {};
|
|
783
|
+
if (pluginEntry.viewerPort == null && topEntry.viewerPort) {
|
|
784
|
+
result.viewerPort = topEntry.viewerPort;
|
|
778
785
|
}
|
|
779
786
|
this.jsonResponse(res, result);
|
|
780
787
|
} catch (e) {
|
|
@@ -797,8 +804,12 @@ export class ViewerServer {
|
|
|
797
804
|
const plugins = raw.plugins as Record<string, unknown>;
|
|
798
805
|
if (!plugins.entries) plugins.entries = {};
|
|
799
806
|
const entries = plugins.entries as Record<string, unknown>;
|
|
800
|
-
|
|
801
|
-
|
|
807
|
+
const entryKey = entries["memos-local-openclaw-plugin"] ? "memos-local-openclaw-plugin"
|
|
808
|
+
: entries["memos-lite-openclaw-plugin"] ? "memos-lite-openclaw-plugin"
|
|
809
|
+
: entries["memos-lite"] ? "memos-lite"
|
|
810
|
+
: "memos-local-openclaw-plugin";
|
|
811
|
+
if (!entries[entryKey]) entries[entryKey] = { enabled: true };
|
|
812
|
+
const entry = entries[entryKey] as Record<string, unknown>;
|
|
802
813
|
if (!entry.config) entry.config = {};
|
|
803
814
|
const config = entry.config as Record<string, unknown>;
|
|
804
815
|
|
|
@@ -891,8 +902,9 @@ export class ViewerServer {
|
|
|
891
902
|
if (fs.existsSync(cfgPath)) {
|
|
892
903
|
try {
|
|
893
904
|
const raw = JSON.parse(fs.readFileSync(cfgPath, "utf-8"));
|
|
894
|
-
const pluginCfg = raw?.plugins?.entries?.["memos-local"]?.config ??
|
|
895
|
-
raw?.plugins?.entries?.["memos-
|
|
905
|
+
const pluginCfg = raw?.plugins?.entries?.["memos-local-openclaw-plugin"]?.config ??
|
|
906
|
+
raw?.plugins?.entries?.["memos-lite"]?.config ??
|
|
907
|
+
raw?.plugins?.entries?.["memos-lite-openclaw-plugin"]?.config ?? {};
|
|
896
908
|
const emb = pluginCfg.embedding;
|
|
897
909
|
hasEmbedding = !!(emb && emb.provider);
|
|
898
910
|
const sum = pluginCfg.summarizer;
|
|
@@ -955,17 +967,18 @@ export class ViewerServer {
|
|
|
955
967
|
|
|
956
968
|
if (this.migrationRunning) {
|
|
957
969
|
res.write(`event: state\ndata: ${JSON.stringify(this.migrationState)}\n\n`);
|
|
970
|
+
this.migrationSSEClients.push(res);
|
|
971
|
+
res.on("close", () => {
|
|
972
|
+
this.migrationSSEClients = this.migrationSSEClients.filter(c => c !== res);
|
|
973
|
+
});
|
|
958
974
|
} else if (this.migrationState.done) {
|
|
975
|
+
const evtName = this.migrationState.stopped ? "stopped" : "done";
|
|
959
976
|
res.write(`event: state\ndata: ${JSON.stringify(this.migrationState)}\n\n`);
|
|
960
|
-
res.write(`event:
|
|
977
|
+
res.write(`event: ${evtName}\ndata: ${JSON.stringify({ ok: true })}\n\n`);
|
|
978
|
+
res.end();
|
|
979
|
+
} else {
|
|
961
980
|
res.end();
|
|
962
|
-
return;
|
|
963
981
|
}
|
|
964
|
-
|
|
965
|
-
this.migrationSSEClients.push(res);
|
|
966
|
-
res.on("close", () => {
|
|
967
|
-
this.migrationSSEClients = this.migrationSSEClients.filter(c => c !== res);
|
|
968
|
-
});
|
|
969
982
|
}
|
|
970
983
|
|
|
971
984
|
private handleMigrateStart(req: http.IncomingMessage, res: http.ServerResponse): void {
|
|
@@ -1057,8 +1070,9 @@ export class ViewerServer {
|
|
|
1057
1070
|
let summarizerCfg: any;
|
|
1058
1071
|
try {
|
|
1059
1072
|
const raw = JSON.parse(fs.readFileSync(cfgPath, "utf-8"));
|
|
1060
|
-
const pluginCfg = raw?.plugins?.entries?.["memos-local"]?.config ??
|
|
1061
|
-
raw?.plugins?.entries?.["memos-
|
|
1073
|
+
const pluginCfg = raw?.plugins?.entries?.["memos-local-openclaw-plugin"]?.config ??
|
|
1074
|
+
raw?.plugins?.entries?.["memos-lite"]?.config ??
|
|
1075
|
+
raw?.plugins?.entries?.["memos-lite-openclaw-plugin"]?.config ?? {};
|
|
1062
1076
|
summarizerCfg = pluginCfg.summarizer;
|
|
1063
1077
|
} catch { /* no config */ }
|
|
1064
1078
|
|