sintbot 1.0.14 → 1.0.15
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/CHANGELOG.en.json +15 -0
- package/CHANGELOG.json +15 -0
- package/package.json +1 -1
- package/src/ui/console.html +62 -18
package/CHANGELOG.en.json
CHANGED
|
@@ -1,4 +1,19 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "1.0.15",
|
|
4
|
+
"date": "2026-10-30",
|
|
5
|
+
"name": "Clearer console settings",
|
|
6
|
+
"items": [
|
|
7
|
+
{
|
|
8
|
+
"t": "Software updates and history together",
|
|
9
|
+
"d": "Update controls and version history now share one card at the bottom of Settings. A small dot appears by the version number when a newer stable release is available."
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"t": "A wider Bot & network card",
|
|
13
|
+
"d": "The card spans the full settings grid, with the bot name and proxy arranged side by side. Background proxy details can be expanded when needed."
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
},
|
|
2
17
|
{
|
|
3
18
|
"version": "1.0.14",
|
|
4
19
|
"date": "2026-10-30",
|
package/CHANGELOG.json
CHANGED
|
@@ -1,4 +1,19 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "1.0.15",
|
|
4
|
+
"date": "2026-10-30",
|
|
5
|
+
"name": "控制台设置布局更清晰",
|
|
6
|
+
"items": [
|
|
7
|
+
{
|
|
8
|
+
"t": "软件更新与版本历史合并",
|
|
9
|
+
"d": "合并为一张卡片并移到设置页底部;检测到新版时,版本号旁会显示一个提示点。"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"t": "机器人与网络卡片横跨整行",
|
|
13
|
+
"d": "机器人的名字和网络代理并排显示,后台网络详情可以展开查看。"
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
},
|
|
2
17
|
{
|
|
3
18
|
"version": "1.0.14",
|
|
4
19
|
"date": "2026-10-30",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sintbot",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.15",
|
|
4
4
|
"description": "Drive headless Claude Code (or Codex) from Slack / Feishu / WeCom group chats — one group, one project, swappable model brain. A standalone daemon, not a Claude Code plugin.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"sbot": "bin/sbot.js",
|
package/src/ui/console.html
CHANGED
|
@@ -242,6 +242,18 @@ body::after{content:"";position:fixed;inset:0;pointer-events:none;z-index:0;opac
|
|
|
242
242
|
.mark .ver{font-family:var(--mono);font-size:10px;font-weight:600;letter-spacing:.3px;color:var(--ember-soft);
|
|
243
243
|
border:1px solid rgba(var(--ember-rgb),.32);border-radius:6px;padding:1px 7px;align-self:center;white-space:nowrap}
|
|
244
244
|
.mark .ver:empty{display:none}
|
|
245
|
+
.mark .ver-update{appearance:none;display:inline-flex;align-items:center;justify-content:center;align-self:center;width:14px;height:16px;margin:0 -4px;padding:0;
|
|
246
|
+
border:0;border-radius:50%;background:transparent;cursor:pointer}
|
|
247
|
+
.mark .ver-update[hidden]{display:none}
|
|
248
|
+
.mark .ver-update:focus-visible{outline:2px solid var(--focus);outline-offset:1px}
|
|
249
|
+
.mark .update-dot{width:5px;height:5px;border-radius:50%;flex:none;background:var(--ember-soft);box-shadow:0 0 0 2px rgba(var(--ember-rgb),.13);
|
|
250
|
+
animation:update-dot-flash 1.4s steps(1,end) infinite;transition:transform .15s,box-shadow .15s}
|
|
251
|
+
.mark .ver-update:hover .update-dot{transform:scale(1.25);box-shadow:0 0 0 3px rgba(var(--ember-rgb),.18)}
|
|
252
|
+
@keyframes update-dot-flash{
|
|
253
|
+
0%,64%,100%{opacity:1;box-shadow:0 0 0 2px rgba(var(--ember-rgb),.13)}
|
|
254
|
+
65%,99%{opacity:.28;box-shadow:0 0 0 0 rgba(var(--ember-rgb),0)}
|
|
255
|
+
}
|
|
256
|
+
@media(prefers-reduced-motion:reduce){.mark .update-dot{animation:none}}
|
|
245
257
|
.top .spacer{flex:1}
|
|
246
258
|
.daemon{display:flex;align-items:center;gap:9px;font-family:var(--sans);font-size:12px;font-weight:500;color:var(--dim)}
|
|
247
259
|
/* 顶栏服务器时钟:整体一枚 chip 胶囊(与全站 .chip 同语言)——「服务器 · 时区 · 时:分:秒」。
|
|
@@ -585,7 +597,22 @@ label.f{display:block;font-family:var(--sans);font-size:11.5px;font-weight:600;l
|
|
|
585
597
|
|
|
586
598
|
h2.sec{font-family:var(--sans);font-size:14px;letter-spacing:.2px;color:var(--ink);margin:34px 2px 14px;font-weight:700}
|
|
587
599
|
/* 版本历史(设置页):时间线式;当前版本行 ember 高亮 */
|
|
588
|
-
#verhistBox{max-height:
|
|
600
|
+
#verhistBox{max-height:240px;overflow-y:auto}
|
|
601
|
+
.update-history{margin-top:18px;padding-top:15px;border-top:1px solid var(--line)}
|
|
602
|
+
.update-history .subhead{font-size:12px;font-weight:650;color:var(--dim);margin-bottom:5px}
|
|
603
|
+
#botNetCard{container-type:inline-size;align-self:start;grid-column:1/-1}
|
|
604
|
+
#botNetCard .botnet-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}
|
|
605
|
+
#botNetCard .botnet-fields .field{min-width:0;margin:0}
|
|
606
|
+
#botNetCard .botnet-extra{margin-top:11px;padding:8px 10px;border:1px solid var(--line);border-radius:8px;background:var(--inset-bg)}
|
|
607
|
+
#botNetCard .botnet-extra>summary{list-style:none;cursor:pointer;color:var(--faint);font-size:11px;user-select:none}
|
|
608
|
+
#botNetCard .botnet-extra>summary::-webkit-details-marker{display:none}
|
|
609
|
+
#botNetCard .botnet-extra>summary::before{content:'›';display:inline-block;margin-right:7px;color:var(--ember);transition:transform .15s}
|
|
610
|
+
#botNetCard .botnet-extra[open]>summary{color:var(--dim);margin-bottom:5px}
|
|
611
|
+
#botNetCard .botnet-extra[open]>summary::before{transform:rotate(90deg)}
|
|
612
|
+
#botNetCard .botnet-extra .hint{margin-top:3px;overflow-wrap:anywhere}
|
|
613
|
+
#botNetCard .botnet-actions{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:14px;padding-top:13px;border-top:1px solid var(--line)}
|
|
614
|
+
#botNetCard .botnet-actions .hint{flex:1 1 240px;min-width:0;margin:0}
|
|
615
|
+
@container (max-width:440px){#botNetCard .botnet-fields{grid-template-columns:minmax(0,1fr)}}
|
|
589
616
|
.vh-row{padding:12px 2px;border-bottom:1px solid var(--line)}
|
|
590
617
|
.vh-row:last-child{border:none}
|
|
591
618
|
.vh-head{display:flex;align-items:baseline;gap:10px}
|
|
@@ -783,6 +810,7 @@ button.btn.nsmini{padding:1px 9px;font-size:11px;font-weight:500;border-radius:7
|
|
|
783
810
|
/* 超窄(手机竖屏):静态的版本徽章让位给动态的 daemon 状态文字 */
|
|
784
811
|
@media(max-width:430px){
|
|
785
812
|
.mark .ver{display:none}
|
|
813
|
+
.mark .ver-update:not([hidden]){width:12px;height:12px;margin-left:-2px;margin-right:-4px}
|
|
786
814
|
.fxapp{display:none} /* 手机竖屏:顶栏只留运行状态 */
|
|
787
815
|
/* nav → edge-to-edge scroll strip if it ever overflows; .navsp(flex:1) pins the 试跑 icon
|
|
788
816
|
right while the text tabs fit (compact icon ⇒ they do at ≤500px), else it collapses and scrolls */
|
|
@@ -840,7 +868,7 @@ d.dataset.theme=t;if(l!=='en'&&l!=='zh')l=/^zh/i.test((navigator.language||''))?
|
|
|
840
868
|
<div class="top">
|
|
841
869
|
<!-- 品牌字标不进翻译层(data-i18n-skip):「Sint」「Bot」是两个文本节点,英文界面下翻译层会把恰好等于某条译文的
|
|
842
870
|
英文反查回中文(i18nZhOrig),「机器人 → Bot」一加,切回中文时左上角就成了「Sint机器人」(10-24 发版前撞到)。 -->
|
|
843
|
-
<div class="mark"><a class="word" href="https://sintbot.com" target="_blank" rel="noopener" title="SintBot 官网" style="color:inherit;text-decoration:none"><span data-i18n-skip>Sint<i class="trace" aria-hidden="true"></i>Bot</span></a><span class="ver">__SBOT_VERSION__</span><small>控制台</small></div>
|
|
871
|
+
<div class="mark"><a class="word" href="https://sintbot.com" target="_blank" rel="noopener" title="SintBot 官网" style="color:inherit;text-decoration:none"><span data-i18n-skip>Sint<i class="trace" aria-hidden="true"></i>Bot</span></a><span class="ver">__SBOT_VERSION__</span><button class="ver-update" id="topUpdateBadge" type="button" hidden title="发现新版本,打开软件更新" aria-label="发现新版本,打开软件更新"><span class="update-dot" aria-hidden="true"></span></button><small>控制台</small></div>
|
|
844
872
|
<div class="spacer"></div>
|
|
845
873
|
<div class="topright">
|
|
846
874
|
<!-- 当前连着的飞书应用(名称 + 图标)。左边 .mark 是产品品牌、固定不变;这块是「这台机器
|
|
@@ -1313,7 +1341,7 @@ async function autoRefresh(){
|
|
|
1313
1341
|
if(sig!==lastStateSig){
|
|
1314
1342
|
lastStateSig=sig;
|
|
1315
1343
|
renderOverview(); tabSig.overview=sig; // 纯展示,直接重画
|
|
1316
|
-
updateDaemon();updateTopFxApp();
|
|
1344
|
+
updateDaemon();updateTopFxApp();updateTopUpdateBadge(); // 顶栏状态在页签之外,得随状态一起显式更新
|
|
1317
1345
|
}else{updateDaemon();updateOverviewLive();updateConnLive();}
|
|
1318
1346
|
}catch{/* 断网/401 交给 SSE 那条自愈路径,这里静默 */}
|
|
1319
1347
|
}
|
|
@@ -3261,17 +3289,19 @@ function renderSettings(){
|
|
|
3261
3289
|
// 代理给连 Claude / ChatGPT 用,国内模型端点自动直连(服务端按已配的模型生成直连名单)
|
|
3262
3290
|
const envPx=S.envProxy||'';
|
|
3263
3291
|
const botCard=`<div class="card" id="botNetCard"><div class="lbl">机器人与网络</div>
|
|
3264
|
-
<div class="
|
|
3265
|
-
<div class="
|
|
3266
|
-
|
|
3267
|
-
<div class="
|
|
3268
|
-
|
|
3269
|
-
|
|
3270
|
-
|
|
3271
|
-
|
|
3292
|
+
<div class="botnet-fields">
|
|
3293
|
+
<div class="field"><label class="f">机器人名字</label><input id="bBrand" placeholder="SintBot" value="${esc(S.brand||'')}"/>
|
|
3294
|
+
<div class="hint" style="margin-top:5px">自我介绍、升级播报里的自称 · 留空 = SintBot</div></div>
|
|
3295
|
+
<div class="field"><label class="f">网络代理</label><input id="pxHttp" placeholder="http://127.0.0.1:7890" value="${esc((px&&px.http)||'')}"/>
|
|
3296
|
+
<div class="hint" style="margin-top:5px">连不上 Claude / ChatGPT 时填 · 国内模型端点自动直连 · 留空 = 不用代理</div></div>
|
|
3297
|
+
</div>
|
|
3298
|
+
${envPx||(px&&px.noProxy)?`<details class="botnet-extra"><summary>后台网络状态</summary>
|
|
3299
|
+
${envPx?`<div class="hint">后台服务的环境里已有代理:<span class="mono">${esc(envPx)}</span></div>`:''}
|
|
3300
|
+
${px&&px.noProxy?`<div class="hint">直连:<span class="mono">${esc(px.noProxy)}</span></div>`:''}
|
|
3301
|
+
</details>`:''}
|
|
3302
|
+
<div class="botnet-actions"><button class="btn primary" id="bSave">保存</button>
|
|
3303
|
+
<div class="hint">代理第一次填,新的对话轮次就生效;改已有的地址要重启后台服务(sintbot service restart)。</div></div>
|
|
3272
3304
|
</div>`;
|
|
3273
|
-
const verhistCard=`<div class="card" style="grid-column:1/-1" id="verhistCard"><div class="lbl">版本历史</div>
|
|
3274
|
-
<div id="verhistBox"><div class="empty">加载中…</div></div></div>`;
|
|
3275
3305
|
const updateJob=upd&&upd.job;
|
|
3276
3306
|
const updateBusy=!!(updateJob&&['queued','installing','restarting','restart-needed'].includes(updateJob.state));
|
|
3277
3307
|
const updateText=!upd?'后台版本检查不可用':updateJob?esc(updateJob.message||updateJob.state):upd.available?`检测到新版本 v${esc(upd.latestVersion)} · 当前 v${esc(upd.currentVersion)}`:upd.checkedAt?`当前为最新版本 v${esc(upd.currentVersion)}`:'尚未检查新版';
|
|
@@ -3288,6 +3318,8 @@ function renderSettings(){
|
|
|
3288
3318
|
<button class="btn" id="updIgnore" ${!upd||!upd.available?'disabled':''}>忽略此版本</button>
|
|
3289
3319
|
</div>
|
|
3290
3320
|
<div class="hint" style="margin-top:10px">只安装检测到的稳定版本;所有群任务与队列清空后才会安装。需要可写的全局安装目录,不会提权;后台服务会自动重启,前台运行需手动重启。</div>
|
|
3321
|
+
<div class="update-history"><div class="subhead">版本历史</div>
|
|
3322
|
+
<div id="verhistBox"><div class="empty">加载中…</div></div></div>
|
|
3291
3323
|
</div>`;
|
|
3292
3324
|
$('#settings').innerHTML=`<div class="grid cols2 stagger">
|
|
3293
3325
|
${netCard}
|
|
@@ -3311,10 +3343,10 @@ function renderSettings(){
|
|
|
3311
3343
|
${fxFeishuCard(fe)}
|
|
3312
3344
|
${fxSlackCard(S.slack||null)}
|
|
3313
3345
|
${fxWecomCard(S.wecom||null)}
|
|
3314
|
-
${updateCard}
|
|
3315
3346
|
${aboutCard}
|
|
3316
|
-
${
|
|
3347
|
+
${updateCard}
|
|
3317
3348
|
</div>`;
|
|
3349
|
+
updateTopUpdateBadge();
|
|
3318
3350
|
loadChangelog();
|
|
3319
3351
|
$('#bSave').onclick=async()=>{const brand=$('#bBrand').value.trim(),http=$('#pxHttp').value.trim();
|
|
3320
3352
|
if(http&&!/^https?:\/\/\S+$/i.test(http)){toast('代理地址要像 http://127.0.0.1:7890','err');return;}
|
|
@@ -3704,6 +3736,16 @@ const splitList=s=>s.split(/[\n,]+/).map(x=>x.trim()).filter(Boolean);
|
|
|
3704
3736
|
// 「开始使用」卡里的「去某页」按钮:委托到 document,重绘不用重新绑
|
|
3705
3737
|
document.addEventListener('click',(e)=>{const b=e.target.closest&&e.target.closest('[data-gotab]');if(!b)return;const t=document.querySelector('[data-tab="'+b.dataset.gotab+'"]');if(t)t.click();});
|
|
3706
3738
|
function renderAll(){renderOverview();renderProviders();renderGroups();renderPlayground();renderSettings();updateDaemon();updateTopFxApp();}
|
|
3739
|
+
function updateTopUpdateBadge(){
|
|
3740
|
+
const badge=$('#topUpdateBadge');if(!badge)return;
|
|
3741
|
+
badge.hidden=!(S&&S.update&&S.update.available);
|
|
3742
|
+
}
|
|
3743
|
+
(()=>{const badge=$('#topUpdateBadge');if(!badge)return;badge.onclick=()=>{
|
|
3744
|
+
const nav=$('nav [data-tab="settings"]');if(nav)nav.click();
|
|
3745
|
+
const card=$('#updateCard');if(!card)return;
|
|
3746
|
+
requestAnimationFrame(()=>{card.scrollIntoView({behavior:'smooth',block:'start'});
|
|
3747
|
+
card.style.boxShadow='0 0 0 2px rgba(var(--ember-rgb),.45)';setTimeout(()=>card.style.boxShadow='',1400);});
|
|
3748
|
+
};})();
|
|
3707
3749
|
// 顶栏应用胶囊。数据同「设置」那张身份条(同一份落盘缓存),没取过就整块不显示 —— 顶栏不适合
|
|
3708
3750
|
// 放「未获取」这类待办文案。头像 JS 注入并留 🤖 兜底(远端图,控制台可能开在断外网的机器上)。
|
|
3709
3751
|
let topFxAvSrc='';
|
|
@@ -3826,6 +3868,7 @@ const I18N_EN=[
|
|
|
3826
3868
|
["机器人名字","Bot name"],
|
|
3827
3869
|
["自我介绍、升级播报里的自称 · 留空 = SintBot","How it refers to itself in introductions and upgrade notices · empty = SintBot"],
|
|
3828
3870
|
["网络代理","Network proxy"],
|
|
3871
|
+
["后台网络状态","Background network details"],
|
|
3829
3872
|
["连不上 Claude / ChatGPT 时填 · 国内模型端点自动直连 · 留空 = 不用代理","Set this if Claude / ChatGPT can't be reached · China model endpoints connect directly · empty = no proxy"],
|
|
3830
3873
|
["后台服务的环境里已有代理:","The background service already has a proxy in its environment: "],
|
|
3831
3874
|
["直连:","Direct: "],
|
|
@@ -4507,6 +4550,7 @@ const I18N_EN=[
|
|
|
4507
4550
|
["开关只控制本程序入口,不会改动反向代理或隧道。","These switches control this app only; they do not change the reverse proxy or tunnel."],
|
|
4508
4551
|
["局域网监听按当前端口即时切换;关闭后只允许本机访问。系统防火墙可能仍会拦截。","LAN binding changes immediately on the current port; when off, only this machine can connect. The system firewall may still block access."],
|
|
4509
4552
|
["软件更新","Software updates"],
|
|
4553
|
+
["发现新版本,打开软件更新","New version available; open software updates"],
|
|
4510
4554
|
["后台版本检查不可用","Version checks are unavailable in this console"],
|
|
4511
4555
|
["自动检查稳定版(启动时及每天)","Automatically checks for stable releases at startup and daily"],
|
|
4512
4556
|
["升级后向群里播报(记住选择)","Announce upgrades in groups (remember this choice)"],
|
|
@@ -5262,7 +5306,7 @@ updateLangBtn();applyI18n(document.body); // 首屏静态 HTML 先翻一遍,
|
|
|
5262
5306
|
/* ══════════ 界面语言 · 完 ════════════════════════════════════════════════════ */
|
|
5263
5307
|
|
|
5264
5308
|
/* 版本历史:CHANGELOG.json 经 /api/changelog 一次拉取;当前版本(=顶栏徽章)标「当前」。
|
|
5265
|
-
顶栏版本徽章可点 →
|
|
5309
|
+
顶栏版本徽章可点 → 跳设置页并滚动到软件更新与版本历史卡片(短暂高亮指位)。
|
|
5266
5310
|
英文界面另拉一份英文本(/api/changelog-en,按 version 对应):正文是数据不是界面文案,词典翻不了它
|
|
5267
5311
|
⇒ 有英文用英文、没有的版本(与条数对不上的条目)原样回退中文;日期与「当前」徽章两语言共用一套。 */
|
|
5268
5312
|
let CHANGELOG=null,CHANGELOG_EN=null;
|
|
@@ -5283,7 +5327,7 @@ async function loadChangelog(){
|
|
|
5283
5327
|
v.onclick=()=>{if(!S)return;
|
|
5284
5328
|
$$('nav button').forEach(x=>x.classList.toggle('active',x.dataset.tab==='settings'));
|
|
5285
5329
|
$$('.tab').forEach(t=>t.classList.toggle('on',t.id==='settings'));
|
|
5286
|
-
const c=$('#
|
|
5330
|
+
const c=$('#updateCard');if(c){c.scrollIntoView({behavior:'smooth',block:'start'});
|
|
5287
5331
|
c.style.boxShadow='0 0 0 2px rgba(var(--ember-rgb),.45)';setTimeout(()=>c.style.boxShadow='',1400);}};})();
|
|
5288
5332
|
|
|
5289
5333
|
/* ── 自绘下拉组件(见 .csel CSS):原生 <select> 的弹出列表是 OS 渲染、CSS 改不动 —— 保留 select
|
|
@@ -5381,7 +5425,7 @@ function startLive(){
|
|
|
5381
5425
|
// recover whatever SSE dropped while we were away (SSE has no replay of its own);
|
|
5382
5426
|
// 重连(非首连)还拉一次全量 state —— 断流期间的 live/conn 变化就地补齐,不整页重渲染。
|
|
5383
5427
|
es.addEventListener('hello',()=>{$('#conn').classList.add('live');syncActivity(true);
|
|
5384
|
-
if(++helloN>1)api('/api/state').then(r=>{S=r;updateDaemon();updateOverviewLive();updateConnLive();startClock();}).catch(()=>{});});
|
|
5428
|
+
if(++helloN>1)api('/api/state').then(r=>{S=r;updateDaemon();updateTopUpdateBadge();updateOverviewLive();updateConnLive();startClock();}).catch(()=>{});});
|
|
5385
5429
|
es.addEventListener('tick',ev=>{try{const d=JSON.parse(ev.data);if(S){if(d.live)S.live=d.live;if('conn' in d)S.conn=d.conn;}updateDaemon();updateOverviewLive();updateConnLive();}catch{}});
|
|
5386
5430
|
startAutoRefresh();
|
|
5387
5431
|
es.addEventListener('conn',ev=>{try{const c=JSON.parse(ev.data);if(S){S.conn=Object.assign({},connDict(S.conn),{[c.platform||'feishu']:c});updateConnLive();}}catch{}}); // 连接状态变化即时推(不等心跳);事件带 platform 名,落进字典对应槽
|