@memtensor/memos-local-openclaw-plugin 1.0.2 → 1.0.3
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/embedding/index.d.ts.map +1 -1
- package/dist/embedding/index.js +4 -3
- package/dist/embedding/index.js.map +1 -1
- package/dist/ingest/extra-paths.d.ts +13 -0
- package/dist/ingest/extra-paths.d.ts.map +1 -0
- package/dist/ingest/extra-paths.js +173 -0
- package/dist/ingest/extra-paths.js.map +1 -0
- package/dist/ingest/providers/index.d.ts.map +1 -1
- package/dist/ingest/providers/index.js +39 -2
- package/dist/ingest/providers/index.js.map +1 -1
- package/dist/recall/engine.js +1 -1
- package/dist/recall/engine.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/update-check.d.ts.map +1 -1
- package/dist/update-check.js +0 -1
- package/dist/update-check.js.map +1 -1
- package/dist/viewer/html.d.ts.map +1 -1
- package/dist/viewer/html.js +73 -37
- package/dist/viewer/html.js.map +1 -1
- package/dist/viewer/server.d.ts.map +1 -1
- package/dist/viewer/server.js +116 -18
- package/dist/viewer/server.js.map +1 -1
- package/index.ts +17 -9
- package/package.json +4 -3
- package/src/embedding/index.ts +4 -2
- package/src/ingest/providers/index.ts +39 -2
- package/src/recall/engine.ts +1 -1
- package/src/types.ts +7 -1
- package/src/update-check.ts +0 -1
- package/src/viewer/html.ts +73 -37
- package/src/viewer/server.ts +102 -16
package/dist/viewer/html.js
CHANGED
|
@@ -589,7 +589,7 @@ input,textarea,select{font-family:inherit;font-size:inherit}
|
|
|
589
589
|
[data-theme="light"] .settings-actions .btn-primary:hover{background:rgba(79,70,229,.1);border-color:#4f46e5}
|
|
590
590
|
.settings-saved{display:inline-flex;align-items:center;gap:6px;color:var(--green);font-size:12px;font-weight:600;opacity:0;transition:opacity .3s}
|
|
591
591
|
.settings-saved.show{opacity:1}
|
|
592
|
-
.model-health-bar{margin-bottom:20px;border-radius:var(--radius-lg);overflow:
|
|
592
|
+
.model-health-bar{margin-bottom:20px;border-radius:var(--radius-lg);overflow:visible}
|
|
593
593
|
.mh-table{width:100%;border-collapse:separate;border-spacing:0;font-size:12px}
|
|
594
594
|
.mh-table th{text-align:left;padding:6px 12px;font-size:10px;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;background:var(--bg);border-bottom:1px solid var(--border)}
|
|
595
595
|
.mh-table td{padding:8px 12px;border-bottom:1px solid var(--border);vertical-align:middle}
|
|
@@ -607,7 +607,8 @@ input,textarea,select{font-family:inherit;font-size:inherit}
|
|
|
607
607
|
.mh-badge.error{background:rgba(239,68,68,.1);color:#dc2626}
|
|
608
608
|
.mh-badge.unknown{background:rgba(148,163,184,.1);color:#64748b}
|
|
609
609
|
.mh-model-name{color:var(--text-muted);font-size:11px;font-family:var(--font-mono,'SFMono-Regular',Consolas,monospace)}
|
|
610
|
-
.mh-err-text{font-size:11px;color:var(--rose);max-width:
|
|
610
|
+
.mh-err-text{font-size:11px;color:var(--rose);max-width:320px;display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:help}
|
|
611
|
+
#mhTooltip{display:none;position:fixed;min-width:280px;max-width:480px;max-height:300px;overflow-y:auto;padding:8px 10px;background:var(--bg-card,#1e1e2e);color:var(--text,#e2e8f0);border:1px solid var(--border,#333);border-radius:6px;font-size:11px;line-height:1.5;white-space:pre-wrap;word-break:break-all;box-shadow:0 4px 12px rgba(0,0,0,.25);z-index:10000;pointer-events:none}
|
|
611
612
|
.mh-time{font-size:10px;color:var(--text-muted);white-space:nowrap}
|
|
612
613
|
.mh-empty{padding:16px;font-size:12px;color:var(--text-muted);text-align:center}
|
|
613
614
|
@keyframes healthPulse{0%,100%{opacity:1}50%{opacity:.4}}
|
|
@@ -1693,10 +1694,11 @@ const I18N={
|
|
|
1693
1694
|
'skill.save.error':'Failed to save skill: ',
|
|
1694
1695
|
'update.available':'New version available',
|
|
1695
1696
|
'update.run':'Run',
|
|
1696
|
-
'update.btn':'Update
|
|
1697
|
-
'update.installing':'Installing
|
|
1698
|
-
'update.success':'
|
|
1697
|
+
'update.btn':'Update',
|
|
1698
|
+
'update.installing':'Installing...',
|
|
1699
|
+
'update.success':'Updated!',
|
|
1699
1700
|
'update.failed':'Update failed',
|
|
1701
|
+
'update.restarting':'Restarting service...',
|
|
1700
1702
|
'update.dismiss':'Dismiss'
|
|
1701
1703
|
},
|
|
1702
1704
|
zh:{
|
|
@@ -2014,10 +2016,11 @@ const I18N={
|
|
|
2014
2016
|
'skill.save.error':'保存技能失败:',
|
|
2015
2017
|
'update.available':'发现新版本',
|
|
2016
2018
|
'update.run':'执行命令',
|
|
2017
|
-
'update.btn':'
|
|
2018
|
-
'update.installing':'
|
|
2019
|
-
'update.success':'
|
|
2019
|
+
'update.btn':'更新',
|
|
2020
|
+
'update.installing':'安装中...',
|
|
2021
|
+
'update.success':'更新完成',
|
|
2020
2022
|
'update.failed':'更新失败',
|
|
2023
|
+
'update.restarting':'正在重启服务...',
|
|
2021
2024
|
'update.dismiss':'关闭'
|
|
2022
2025
|
}
|
|
2023
2026
|
};
|
|
@@ -3011,7 +3014,14 @@ function classifyError(msg){
|
|
|
3011
3014
|
if(msg.indexOf('ECONNREFUSED')>=0) return 'Connection refused';
|
|
3012
3015
|
if(msg.indexOf('ENOTFOUND')>=0) return 'DNS resolution failed';
|
|
3013
3016
|
if(msg.indexOf('403')>=0) return 'Forbidden (403)';
|
|
3014
|
-
return
|
|
3017
|
+
if(msg.indexOf('503')>=0||msg.indexOf('upstream connect error')>=0||msg.indexOf('Service Unavailable')>=0) return 'Service unavailable (503)';
|
|
3018
|
+
if(msg.indexOf('502')>=0||msg.indexOf('Bad Gateway')>=0) return 'Bad gateway (502)';
|
|
3019
|
+
if(msg.indexOf('500')>=0||msg.indexOf('Internal Server Error')>=0) return 'Server error (500)';
|
|
3020
|
+
if(msg.indexOf('404')>=0||msg.indexOf('Not Found')>=0) return 'Not found (404)';
|
|
3021
|
+
if(msg.indexOf('fetch failed')>=0||msg.indexOf('ETIMEDOUT')>=0) return 'Network error';
|
|
3022
|
+
if(msg.indexOf('Unknown')>=0&&msg.indexOf('provider')>=0) return 'Unknown provider';
|
|
3023
|
+
var m=msg.match(/\((\d{3})\)/); if(m) return 'HTTP error ('+m[1]+')';
|
|
3024
|
+
return msg.length>80?msg.substring(0,77)+'...':msg;
|
|
3015
3025
|
}
|
|
3016
3026
|
|
|
3017
3027
|
function shortenModel(s){return s?s.replace('openai_compatible/','').replace('openai/',''):'\u2014';}
|
|
@@ -3057,7 +3067,7 @@ async function loadModelHealth(){
|
|
|
3057
3067
|
issue+=shortErr;
|
|
3058
3068
|
if(m.consecutiveErrors>1) issue+=' ('+m.consecutiveErrors+'x)';
|
|
3059
3069
|
}
|
|
3060
|
-
if(issue) h+='<td><span class="mh-err-text"
|
|
3070
|
+
if(issue) h+='<td><span class="mh-err-text" data-err="'+escapeHtml(m.lastErrorMessage||'')+'">'+escapeHtml(issue)+'</span></td>';
|
|
3061
3071
|
else h+='<td><span style="color:var(--text-muted);font-size:11px">\u2014</span></td>';
|
|
3062
3072
|
|
|
3063
3073
|
h+='<td style="text-align:right"><span class="mh-time">'+(ago||'\u2014')+'</span></td>';
|
|
@@ -3065,11 +3075,29 @@ async function loadModelHealth(){
|
|
|
3065
3075
|
}
|
|
3066
3076
|
h+='</tbody></table>';
|
|
3067
3077
|
bar.innerHTML=h;
|
|
3078
|
+
initMhTooltips();
|
|
3068
3079
|
}catch(e){
|
|
3069
3080
|
bar.innerHTML='<div class="mh-empty">Failed to load model health</div>';
|
|
3070
3081
|
}
|
|
3071
3082
|
}
|
|
3072
3083
|
|
|
3084
|
+
function initMhTooltips(){
|
|
3085
|
+
var tip=document.getElementById('mhTooltip');
|
|
3086
|
+
if(!tip){tip=document.createElement('div');tip.id='mhTooltip';document.body.appendChild(tip);}
|
|
3087
|
+
document.querySelectorAll('.mh-err-text[data-err]').forEach(function(el){
|
|
3088
|
+
el.addEventListener('mouseenter',function(e){
|
|
3089
|
+
var msg=el.getAttribute('data-err');
|
|
3090
|
+
if(!msg)return;
|
|
3091
|
+
tip.textContent=msg;
|
|
3092
|
+
tip.style.display='block';
|
|
3093
|
+
var rect=el.getBoundingClientRect();
|
|
3094
|
+
tip.style.left=Math.max(0,Math.min(rect.left,window.innerWidth-490))+'px';
|
|
3095
|
+
tip.style.top=(rect.bottom+6)+'px';
|
|
3096
|
+
});
|
|
3097
|
+
el.addEventListener('mouseleave',function(){tip.style.display='none';});
|
|
3098
|
+
});
|
|
3099
|
+
}
|
|
3100
|
+
|
|
3073
3101
|
function timeAgo(ts){
|
|
3074
3102
|
var diff=Date.now()-ts;
|
|
3075
3103
|
if(diff<60000) return 'just now';
|
|
@@ -4666,35 +4694,35 @@ function waitForGatewayAndReload(maxAttempts,attempt){
|
|
|
4666
4694
|
attempt=attempt||0;
|
|
4667
4695
|
if(attempt>=maxAttempts){window.location.reload();return;}
|
|
4668
4696
|
setTimeout(function(){
|
|
4669
|
-
fetch('/api/
|
|
4670
|
-
|
|
4671
|
-
else waitForGatewayAndReload(maxAttempts,attempt+1);
|
|
4697
|
+
fetch('/api/auth/status').then(function(){
|
|
4698
|
+
window.location.reload();
|
|
4672
4699
|
}).catch(function(){waitForGatewayAndReload(maxAttempts,attempt+1);});
|
|
4673
4700
|
},3000);
|
|
4674
4701
|
}
|
|
4675
|
-
function doUpdateInstall(packageSpec,btnEl){
|
|
4702
|
+
function doUpdateInstall(packageSpec,btnEl,statusEl){
|
|
4676
4703
|
btnEl.disabled=true;
|
|
4677
4704
|
btnEl.textContent=t('update.installing');
|
|
4705
|
+
btnEl.style.cssText='background:rgba(99,102,241,.15);color:var(--pri);border:1px solid rgba(99,102,241,.3);border-radius:6px;padding:4px 14px;font-size:12px;font-weight:600;cursor:wait;white-space:nowrap';
|
|
4678
4706
|
fetch('/api/update-install',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({packageSpec:packageSpec})})
|
|
4679
4707
|
.then(function(r){return r.json()})
|
|
4680
4708
|
.then(function(d){
|
|
4681
4709
|
if(d.ok){
|
|
4682
4710
|
btnEl.textContent=t('update.success');
|
|
4683
|
-
btnEl.style.
|
|
4684
|
-
|
|
4685
|
-
waitForGatewayAndReload(
|
|
4711
|
+
btnEl.style.cssText='background:rgba(34,197,94,.15);color:#22c55e;border:1px solid rgba(34,197,94,.3);border-radius:6px;padding:4px 14px;font-size:12px;font-weight:600;cursor:default;white-space:nowrap';
|
|
4712
|
+
if(statusEl)statusEl.textContent=t('update.restarting');
|
|
4713
|
+
waitForGatewayAndReload(40);
|
|
4686
4714
|
}else{
|
|
4687
|
-
btnEl.textContent=t('update.
|
|
4688
|
-
btnEl.style.
|
|
4689
|
-
btnEl.style.color='#fff';
|
|
4715
|
+
btnEl.textContent=t('update.btn');
|
|
4716
|
+
btnEl.style.cssText='background:none;border:1px solid currentColor;border-radius:6px;padding:4px 14px;font-size:12px;font-weight:600;color:inherit;cursor:pointer;white-space:nowrap;opacity:.85';
|
|
4690
4717
|
btnEl.disabled=false;
|
|
4691
|
-
|
|
4718
|
+
if(statusEl)statusEl.textContent=t('update.failed')+': '+(d.error||'').slice(0,60);
|
|
4719
|
+
setTimeout(function(){if(statusEl)statusEl.textContent='';},8000);
|
|
4692
4720
|
}
|
|
4693
4721
|
})
|
|
4694
|
-
.catch(function(
|
|
4695
|
-
btnEl.textContent=t('update.
|
|
4722
|
+
.catch(function(){
|
|
4723
|
+
btnEl.textContent=t('update.btn');
|
|
4724
|
+
btnEl.style.cssText='background:none;border:1px solid currentColor;border-radius:6px;padding:4px 14px;font-size:12px;font-weight:600;color:inherit;cursor:pointer;white-space:nowrap;opacity:.85';
|
|
4696
4725
|
btnEl.disabled=false;
|
|
4697
|
-
setTimeout(function(){btnEl.textContent=t('update.btn');btnEl.style.background='';btnEl.style.color='';},5000);
|
|
4698
4726
|
});
|
|
4699
4727
|
}
|
|
4700
4728
|
async function checkForUpdate(){
|
|
@@ -4703,25 +4731,33 @@ async function checkForUpdate(){
|
|
|
4703
4731
|
if(!r.ok)return;
|
|
4704
4732
|
const d=await r.json();
|
|
4705
4733
|
if(!d.updateAvailable)return;
|
|
4706
|
-
const pkgSpec=d.installCommand?d.installCommand.replace(/^openclaw
|
|
4707
|
-
|
|
4734
|
+
const pkgSpec=d.installCommand?d.installCommand.replace(/^(?:npx\s+)?openclaw\s+plugins\s+install\s+/,''):(d.packageName+'@'+d.latest);
|
|
4735
|
+
var banner=document.createElement('div');
|
|
4708
4736
|
banner.id='updateBanner';
|
|
4709
|
-
banner.style.cssText='
|
|
4710
|
-
var
|
|
4711
|
-
|
|
4737
|
+
banner.style.cssText='display:flex;align-items:center;gap:10px;padding:12px 20px;font-size:13px;font-weight:500;border-radius:10px;margin:0 32px;animation:slideIn .3s ease;background:rgba(245,158,11,.1);color:#d97706;border:1px solid rgba(245,158,11,.25)';
|
|
4738
|
+
var textNode=document.createElement('div');
|
|
4739
|
+
textNode.style.cssText='display:flex;align-items:center;gap:8px;flex-shrink:0';
|
|
4740
|
+
textNode.innerHTML='\u{1F4E6} '+t('update.available')+' <b style="margin:0 2px">v'+esc(d.current)+'</b> \u2192 <b style="margin:0 2px">v'+esc(d.latest)+'</b>';
|
|
4712
4741
|
var btnUpdate=document.createElement('button');
|
|
4742
|
+
btnUpdate.className='emb-banner-btn';
|
|
4713
4743
|
btnUpdate.textContent=t('update.btn');
|
|
4714
|
-
|
|
4715
|
-
|
|
4744
|
+
var statusDiv=document.createElement('div');
|
|
4745
|
+
statusDiv.style.cssText='font-size:11px;opacity:.8;flex-shrink:0';
|
|
4746
|
+
btnUpdate.onclick=function(){doUpdateInstall(pkgSpec,btnUpdate,statusDiv)};
|
|
4747
|
+
textNode.appendChild(btnUpdate);
|
|
4748
|
+
var spacer=document.createElement('div');
|
|
4749
|
+
spacer.style.cssText='flex:1';
|
|
4716
4750
|
var btnClose=document.createElement('button');
|
|
4751
|
+
btnClose.className='emb-banner-close';
|
|
4717
4752
|
btnClose.innerHTML='×';
|
|
4718
|
-
btnClose.
|
|
4719
|
-
|
|
4720
|
-
|
|
4721
|
-
banner.appendChild(
|
|
4753
|
+
btnClose.onclick=function(){banner.remove()};
|
|
4754
|
+
banner.appendChild(textNode);
|
|
4755
|
+
banner.appendChild(statusDiv);
|
|
4756
|
+
banner.appendChild(spacer);
|
|
4722
4757
|
banner.appendChild(btnClose);
|
|
4723
|
-
document.
|
|
4724
|
-
|
|
4758
|
+
var embBanner=document.querySelector('.emb-banner');
|
|
4759
|
+
if(embBanner&&embBanner.parentNode){embBanner.parentNode.insertBefore(banner,embBanner);}
|
|
4760
|
+
else{var ct=document.querySelector('.content-area')||document.querySelector('main')||document.body;if(ct.firstChild)ct.insertBefore(banner,ct.firstChild);else ct.appendChild(banner);}
|
|
4725
4761
|
}catch(e){}
|
|
4726
4762
|
}
|
|
4727
4763
|
|
package/dist/viewer/html.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/viewer/html.ts"],"names":[],"mappings":";;AAAA,
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/viewer/html.ts"],"names":[],"mappings":";;AAAA,gCA4qJC;AA5qJD,SAAgB,UAAU,CAAC,aAAsB;IACjD,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,gCAAgC,aAAa,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3F,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sDAyxB+C,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAg5HpD,CAAC;AACT,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/viewer/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/viewer/server.ts"],"names":[],"mappings":"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"}
|
package/dist/viewer/server.js
CHANGED
|
@@ -38,6 +38,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.ViewerServer = void 0;
|
|
40
40
|
const node_http_1 = __importDefault(require("node:http"));
|
|
41
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
41
42
|
const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
42
43
|
const node_child_process_1 = require("node:child_process");
|
|
43
44
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
@@ -1260,36 +1261,133 @@ class ViewerServer {
|
|
|
1260
1261
|
req.on("data", (chunk) => { body += chunk.toString(); });
|
|
1261
1262
|
req.on("end", () => {
|
|
1262
1263
|
try {
|
|
1263
|
-
const { packageSpec } = JSON.parse(body);
|
|
1264
|
-
if (!
|
|
1264
|
+
const { packageSpec: rawSpec } = JSON.parse(body);
|
|
1265
|
+
if (!rawSpec || typeof rawSpec !== "string") {
|
|
1265
1266
|
res.writeHead(400, { "Content-Type": "application/json" });
|
|
1266
1267
|
res.end(JSON.stringify({ ok: false, error: "Missing packageSpec" }));
|
|
1267
1268
|
return;
|
|
1268
1269
|
}
|
|
1270
|
+
const packageSpec = rawSpec.trim().replace(/^(?:npx\s+)?openclaw\s+plugins\s+install\s+/i, "");
|
|
1269
1271
|
const allowed = /^@[\w-]+\/[\w.-]+(@[\w.-]+)?$/;
|
|
1272
|
+
this.log.info(`update-install: received packageSpec="${packageSpec}" (len=${packageSpec.length})`);
|
|
1270
1273
|
if (!allowed.test(packageSpec)) {
|
|
1274
|
+
this.log.warn(`update-install: rejected packageSpec="${packageSpec}" — does not match ${allowed}`);
|
|
1271
1275
|
res.writeHead(400, { "Content-Type": "application/json" });
|
|
1272
|
-
res.end(JSON.stringify({ ok: false, error:
|
|
1276
|
+
res.end(JSON.stringify({ ok: false, error: `Invalid package spec: "${packageSpec}"` }));
|
|
1273
1277
|
return;
|
|
1274
1278
|
}
|
|
1275
|
-
this.
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1279
|
+
const pkgPath = this.findPluginPackageJson();
|
|
1280
|
+
const pluginName = pkgPath
|
|
1281
|
+
? (() => { try {
|
|
1282
|
+
return JSON.parse(node_fs_1.default.readFileSync(pkgPath, "utf-8")).name;
|
|
1283
|
+
}
|
|
1284
|
+
catch {
|
|
1285
|
+
return null;
|
|
1286
|
+
} })()
|
|
1287
|
+
: null;
|
|
1288
|
+
const shortName = pluginName?.replace(/^@[\w-]+\//, "") ?? "memos-local-openclaw-plugin";
|
|
1289
|
+
const extDir = node_path_1.default.join(node_os_1.default.homedir(), ".openclaw", "extensions", shortName);
|
|
1290
|
+
const tmpDir = node_path_1.default.join(node_os_1.default.tmpdir(), `openclaw-update-${Date.now()}`);
|
|
1291
|
+
// Download via npm pack, extract, and replace extension dir.
|
|
1292
|
+
// Does NOT touch openclaw.json → no config watcher SIGUSR1.
|
|
1293
|
+
this.log.info(`update-install: downloading ${packageSpec} via npm pack...`);
|
|
1294
|
+
node_fs_1.default.mkdirSync(tmpDir, { recursive: true });
|
|
1295
|
+
(0, node_child_process_1.exec)(`npm pack ${packageSpec} --pack-destination ${tmpDir}`, { timeout: 60_000 }, (packErr, packOut) => {
|
|
1296
|
+
if (packErr) {
|
|
1297
|
+
this.log.warn(`update-install: npm pack failed: ${packErr.message}`);
|
|
1298
|
+
this.jsonResponse(res, { ok: false, error: `Download failed: ${packErr.message}` });
|
|
1299
|
+
try {
|
|
1300
|
+
node_fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
|
|
1301
|
+
}
|
|
1302
|
+
catch { }
|
|
1280
1303
|
return;
|
|
1281
1304
|
}
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
this.log.info(`update-install:
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1305
|
+
const tgzFile = packOut.trim().split("\n").pop();
|
|
1306
|
+
const tgzPath = node_path_1.default.join(tmpDir, tgzFile);
|
|
1307
|
+
this.log.info(`update-install: downloaded ${tgzFile}, extracting...`);
|
|
1308
|
+
const extractDir = node_path_1.default.join(tmpDir, "extract");
|
|
1309
|
+
node_fs_1.default.mkdirSync(extractDir, { recursive: true });
|
|
1310
|
+
(0, node_child_process_1.exec)(`tar -xzf ${tgzPath} -C ${extractDir}`, { timeout: 30_000 }, (tarErr) => {
|
|
1311
|
+
if (tarErr) {
|
|
1312
|
+
this.log.warn(`update-install: tar extract failed: ${tarErr.message}`);
|
|
1313
|
+
this.jsonResponse(res, { ok: false, error: `Extract failed: ${tarErr.message}` });
|
|
1314
|
+
try {
|
|
1315
|
+
node_fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
|
|
1316
|
+
}
|
|
1317
|
+
catch { }
|
|
1318
|
+
return;
|
|
1319
|
+
}
|
|
1320
|
+
// npm pack extracts to a "package" subdirectory
|
|
1321
|
+
const srcDir = node_path_1.default.join(extractDir, "package");
|
|
1322
|
+
if (!node_fs_1.default.existsSync(srcDir)) {
|
|
1323
|
+
this.jsonResponse(res, { ok: false, error: "Extracted package has no 'package' dir" });
|
|
1324
|
+
try {
|
|
1325
|
+
node_fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
|
|
1326
|
+
}
|
|
1327
|
+
catch { }
|
|
1328
|
+
return;
|
|
1329
|
+
}
|
|
1330
|
+
// Replace extension directory
|
|
1331
|
+
this.log.info(`update-install: replacing ${extDir}...`);
|
|
1332
|
+
try {
|
|
1333
|
+
node_fs_1.default.rmSync(extDir, { recursive: true, force: true });
|
|
1334
|
+
}
|
|
1335
|
+
catch { }
|
|
1336
|
+
node_fs_1.default.mkdirSync(node_path_1.default.dirname(extDir), { recursive: true });
|
|
1337
|
+
node_fs_1.default.renameSync(srcDir, extDir);
|
|
1338
|
+
// Install dependencies
|
|
1339
|
+
this.log.info(`update-install: installing dependencies...`);
|
|
1340
|
+
(0, node_child_process_1.exec)(`cd ${extDir} && npm install --omit=dev --ignore-scripts`, { timeout: 120_000 }, (npmErr, npmOut, npmStderr) => {
|
|
1341
|
+
if (npmErr) {
|
|
1342
|
+
try {
|
|
1343
|
+
node_fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
|
|
1344
|
+
}
|
|
1345
|
+
catch { }
|
|
1346
|
+
this.log.warn(`update-install: npm install failed: ${npmErr.message}`);
|
|
1347
|
+
this.jsonResponse(res, { ok: false, error: `Dependency install failed: ${npmStderr || npmErr.message}` });
|
|
1348
|
+
return;
|
|
1349
|
+
}
|
|
1350
|
+
// Rebuild native modules (do not swallow errors)
|
|
1351
|
+
(0, node_child_process_1.exec)(`cd ${extDir} && npm rebuild better-sqlite3`, { timeout: 60_000 }, (rebuildErr, rebuildOut, rebuildStderr) => {
|
|
1352
|
+
if (rebuildErr) {
|
|
1353
|
+
this.log.warn(`update-install: better-sqlite3 rebuild failed: ${rebuildErr.message}`);
|
|
1354
|
+
const stderr = String(rebuildStderr || "").trim();
|
|
1355
|
+
if (stderr)
|
|
1356
|
+
this.log.warn(`update-install: rebuild stderr: ${stderr.slice(0, 500)}`);
|
|
1357
|
+
// Continue so postinstall.cjs can run (it will try rebuild again and show user guidance)
|
|
1358
|
+
}
|
|
1359
|
+
// Run postinstall.cjs: legacy cleanup, skill install, version marker, and optional sqlite re-check
|
|
1360
|
+
this.log.info(`update-install: running postinstall...`);
|
|
1361
|
+
(0, node_child_process_1.exec)(`cd ${extDir} && node scripts/postinstall.cjs`, { timeout: 180_000 }, (postErr, postOut, postStderr) => {
|
|
1362
|
+
try {
|
|
1363
|
+
node_fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
|
|
1364
|
+
}
|
|
1365
|
+
catch { }
|
|
1366
|
+
if (postErr) {
|
|
1367
|
+
this.log.warn(`update-install: postinstall failed: ${postErr.message}`);
|
|
1368
|
+
const postStderrStr = String(postStderr || "").trim();
|
|
1369
|
+
if (postStderrStr)
|
|
1370
|
+
this.log.warn(`update-install: postinstall stderr: ${postStderrStr.slice(0, 500)}`);
|
|
1371
|
+
// Still report success; plugin is updated, user can run postinstall manually if needed
|
|
1372
|
+
}
|
|
1373
|
+
// Read new version
|
|
1374
|
+
let newVersion = "unknown";
|
|
1375
|
+
try {
|
|
1376
|
+
const newPkg = JSON.parse(node_fs_1.default.readFileSync(node_path_1.default.join(extDir, "package.json"), "utf-8"));
|
|
1377
|
+
newVersion = newPkg.version ?? newVersion;
|
|
1378
|
+
}
|
|
1379
|
+
catch { }
|
|
1380
|
+
this.log.info(`update-install: success! Updated to ${newVersion}`);
|
|
1381
|
+
this.jsonResponse(res, { ok: true, version: newVersion });
|
|
1382
|
+
// Trigger Gateway restart after response is sent
|
|
1383
|
+
setTimeout(() => {
|
|
1384
|
+
this.log.info(`update-install: triggering gateway restart...`);
|
|
1385
|
+
process.kill(process.pid, "SIGUSR1");
|
|
1386
|
+
}, 500);
|
|
1387
|
+
});
|
|
1388
|
+
});
|
|
1291
1389
|
});
|
|
1292
|
-
}
|
|
1390
|
+
});
|
|
1293
1391
|
});
|
|
1294
1392
|
}
|
|
1295
1393
|
catch (e) {
|