fix(settings): let the models page set the default connection - #2421

Merged
jackwener merged 2 commits into
mainfrom
pr-set-default-connection-20
Aug 7, 2026
Merged

fix(settings): let the models page set the default connection#2421
jackwener merged 2 commits into
mainfrom
pr-set-default-connection-20

Conversation

@jackwener

Copy link
Copy Markdown
Member

Closes#158

问题

换默认连接只能从命令面板(⌘K)。模型页在默认连接上挂着「默认」Badge——状态看得见,控件不存在。用户反馈原话:「这默认模型连接改不了吗,在模型里找半天」——他找的地方是对的,是界面把路堵死了。

改法

连接详情头部那个槽位现在同时承担一件事的两面:

  • 是默认 → 显示「默认」Badge(不变)
  • 不是默认 → 同一个槽位显示「设为默认」按钮

状态在哪显示,控件就在哪。

clickAction:不弹确认,所以事务里没有 state 驱动的 UI 要等(无死锁风险),pending 态自带。失败时 toast 报错、状态不动,按钮留在原地可重试。

命令面板入口保留——它从来没错,只是看不见。

验证

真机 e2e 跑通两态并确认交互闭环:

  • 清掉默认后进详情:按钮出现(1)
  • 点击后:按钮消失(0),Badge 就地接替(+1)

截图两张(按钮态 / Badge 态)已发任务线程。typecheck(我的文件)/ lint / format 全绿;ProvidersPanel 相关 e2e 断言扫过,只有「默认模型」那组,和本改动的「默认连接」是两个概念,无碰撞。

一处留给设计裁定

spec 第 3 条要求"不可设默认时按钮禁用且说明原因"——我查了后端,connections:setDefault 只在连接不存在时报错,没有任何可用性/凭据门槛,任何存在的连接都能设默认。所以没有可禁用的条件,我没有发明一个。要不要给"连接不可用时设默认"加护栏,是产品判断。

Closes#158.
Changing the default connection was possible only from the command palette.
The models page displayed a 默认 Badge on whichever connection held it and
offered no way to change it — so a user who went looking where the answer is
shown found a read-only label. One of them said so: "这默认模型连接改不了吗,
在模型里找半天." They were looking in exactly the right place.
The badge slot in the connection detail header now carries both halves of the
same fact: the default connection shows the Badge, and any other connection
shows a 设为默认 button in its place. Whichever a connection is, that slot
tells you — and is how you change it.
`clickAction` rather than onClick: this opens no confirmation, so there is no
state-driven UI to await inside the transition, and the pending affordance
comes with it. On failure the toast reports and the state does not move, which
leaves the button where it was to retry.
The command palette entry stays. It was never wrong, only invisible.
Review caught that ghost was the wrong variant here. A ghost button alone
beside a title is bare text, which reads as a subtitle rather than something
pressable — recreating the exact problem this change exists to solve, on the
one surface where a user has already demonstrated that not-obvious means
not-found.
secondary sm matches 测试连接 directly below it, which is this page's dialect
for a quiet but unmistakable control.
@jackwener

Copy link
Copy Markdown
MemberAuthor

Review by maka-审美专家 — 通过:「设为默认」控件落地在状态显示的同一槽位(控件贴对象法则),secondary sm 与同页 测试连接 同方言(首版 ghost 读作文字标签的问题经截图证实后改判,变体取舍理由留注释防回改);交互闭环以计数断言实证(按钮 1→0、Badge 0→1);护栏不加的裁定成立——禁用态自述规矩管已存在的禁用态,不发明禁用条件;命令面板入口保留。CI 绿。合入。

@jackwener
jackwener merged commit b2dff0b into mainAug 7, 2026
12 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(settings): let the models page set the default connection - #2421

Merged
jackwener merged 2 commits into
mainfrom
pr-set-default-connection-20
Aug 7, 2026
Merged

fix(settings): let the models page set the default connection#2421
jackwener merged 2 commits into
mainfrom
pr-set-default-connection-20

Conversation

@jackwener

Copy link
Copy Markdown
Member

Closes#158

问题

换默认连接只能从命令面板(⌘K)。模型页在默认连接上挂着「默认」Badge——状态看得见,控件不存在。用户反馈原话:「这默认模型连接改不了吗,在模型里找半天」——他找的地方是对的,是界面把路堵死了。

改法

连接详情头部那个槽位现在同时承担一件事的两面:

  • 是默认 → 显示「默认」Badge(不变)
  • 不是默认 → 同一个槽位显示「设为默认」按钮

状态在哪显示,控件就在哪。

clickAction:不弹确认,所以事务里没有 state 驱动的 UI 要等(无死锁风险),pending 态自带。失败时 toast 报错、状态不动,按钮留在原地可重试。

命令面板入口保留——它从来没错,只是看不见。

验证

真机 e2e 跑通两态并确认交互闭环:

  • 清掉默认后进详情:按钮出现(1)
  • 点击后:按钮消失(0),Badge 就地接替(+1)

截图两张(按钮态 / Badge 态)已发任务线程。typecheck(我的文件)/ lint / format 全绿;ProvidersPanel 相关 e2e 断言扫过,只有「默认模型」那组,和本改动的「默认连接」是两个概念,无碰撞。

一处留给设计裁定

spec 第 3 条要求"不可设默认时按钮禁用且说明原因"——我查了后端,connections:setDefault 只在连接不存在时报错,没有任何可用性/凭据门槛,任何存在的连接都能设默认。所以没有可禁用的条件,我没有发明一个。要不要给"连接不可用时设默认"加护栏,是产品判断。

Closes#158.
Changing the default connection was possible only from the command palette.
The models page displayed a 默认 Badge on whichever connection held it and
offered no way to change it — so a user who went looking where the answer is
shown found a read-only label. One of them said so: "这默认模型连接改不了吗,
在模型里找半天." They were looking in exactly the right place.
The badge slot in the connection detail header now carries both halves of the
same fact: the default connection shows the Badge, and any other connection
shows a 设为默认 button in its place. Whichever a connection is, that slot
tells you — and is how you change it.
`clickAction` rather than onClick: this opens no confirmation, so there is no
state-driven UI to await inside the transition, and the pending affordance
comes with it. On failure the toast reports and the state does not move, which
leaves the button where it was to retry.
The command palette entry stays. It was never wrong, only invisible.
Review caught that ghost was the wrong variant here. A ghost button alone
beside a title is bare text, which reads as a subtitle rather than something
pressable — recreating the exact problem this change exists to solve, on the
one surface where a user has already demonstrated that not-obvious means
not-found.
secondary sm matches 测试连接 directly below it, which is this page's dialect
for a quiet but unmistakable control.
@jackwener

Copy link
Copy Markdown
MemberAuthor

Review by maka-审美专家 — 通过:「设为默认」控件落地在状态显示的同一槽位(控件贴对象法则),secondary sm 与同页 测试连接 同方言(首版 ghost 读作文字标签的问题经截图证实后改判,变体取舍理由留注释防回改);交互闭环以计数断言实证(按钮 1→0、Badge 0→1);护栏不加的裁定成立——禁用态自述规矩管已存在的禁用态,不发明禁用条件;命令面板入口保留。CI 绿。合入。

@jackwener
jackwener merged commit b2dff0b into mainAug 7, 2026
12 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(settings): let the models page set the default connection - #2421

Merged
jackwener merged 2 commits into
mainfrom
pr-set-default-connection-20
Aug 7, 2026
Merged

fix(settings): let the models page set the default connection#2421
jackwener merged 2 commits into
mainfrom
pr-set-default-connection-20

Conversation

@jackwener

Copy link
Copy Markdown
Member

Closes#158

问题

换默认连接只能从命令面板(⌘K)。模型页在默认连接上挂着「默认」Badge——状态看得见,控件不存在。用户反馈原话:「这默认模型连接改不了吗,在模型里找半天」——他找的地方是对的,是界面把路堵死了。

改法

连接详情头部那个槽位现在同时承担一件事的两面:

  • 是默认 → 显示「默认」Badge(不变)
  • 不是默认 → 同一个槽位显示「设为默认」按钮

状态在哪显示,控件就在哪。

clickAction:不弹确认,所以事务里没有 state 驱动的 UI 要等(无死锁风险),pending 态自带。失败时 toast 报错、状态不动,按钮留在原地可重试。

命令面板入口保留——它从来没错,只是看不见。

验证

真机 e2e 跑通两态并确认交互闭环:

  • 清掉默认后进详情:按钮出现(1)
  • 点击后:按钮消失(0),Badge 就地接替(+1)

截图两张(按钮态 / Badge 态)已发任务线程。typecheck(我的文件)/ lint / format 全绿;ProvidersPanel 相关 e2e 断言扫过,只有「默认模型」那组,和本改动的「默认连接」是两个概念,无碰撞。

一处留给设计裁定

spec 第 3 条要求"不可设默认时按钮禁用且说明原因"——我查了后端,connections:setDefault 只在连接不存在时报错,没有任何可用性/凭据门槛,任何存在的连接都能设默认。所以没有可禁用的条件,我没有发明一个。要不要给"连接不可用时设默认"加护栏,是产品判断。

Closes#158.
Changing the default connection was possible only from the command palette.
The models page displayed a 默认 Badge on whichever connection held it and
offered no way to change it — so a user who went looking where the answer is
shown found a read-only label. One of them said so: "这默认模型连接改不了吗,
在模型里找半天." They were looking in exactly the right place.
The badge slot in the connection detail header now carries both halves of the
same fact: the default connection shows the Badge, and any other connection
shows a 设为默认 button in its place. Whichever a connection is, that slot
tells you — and is how you change it.
`clickAction` rather than onClick: this opens no confirmation, so there is no
state-driven UI to await inside the transition, and the pending affordance
comes with it. On failure the toast reports and the state does not move, which
leaves the button where it was to retry.
The command palette entry stays. It was never wrong, only invisible.
Review caught that ghost was the wrong variant here. A ghost button alone
beside a title is bare text, which reads as a subtitle rather than something
pressable — recreating the exact problem this change exists to solve, on the
one surface where a user has already demonstrated that not-obvious means
not-found.
secondary sm matches 测试连接 directly below it, which is this page's dialect
for a quiet but unmistakable control.
@jackwener

Copy link
Copy Markdown
MemberAuthor

Review by maka-审美专家 — 通过:「设为默认」控件落地在状态显示的同一槽位(控件贴对象法则),secondary sm 与同页 测试连接 同方言(首版 ghost 读作文字标签的问题经截图证实后改判,变体取舍理由留注释防回改);交互闭环以计数断言实证(按钮 1→0、Badge 0→1);护栏不加的裁定成立——禁用态自述规矩管已存在的禁用态,不发明禁用条件;命令面板入口保留。CI 绿。合入。

@jackwener
jackwener merged commit b2dff0b into mainAug 7, 2026
12 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(settings): let the models page set the default connection - #2421

Merged
jackwener merged 2 commits into
mainfrom
pr-set-default-connection-20
Aug 7, 2026
Merged

fix(settings): let the models page set the default connection#2421
jackwener merged 2 commits into
mainfrom
pr-set-default-connection-20

Conversation

@jackwener

Copy link
Copy Markdown
Member

Closes#158

问题

换默认连接只能从命令面板(⌘K)。模型页在默认连接上挂着「默认」Badge——状态看得见,控件不存在。用户反馈原话:「这默认模型连接改不了吗,在模型里找半天」——他找的地方是对的,是界面把路堵死了。

改法

连接详情头部那个槽位现在同时承担一件事的两面:

  • 是默认 → 显示「默认」Badge(不变)
  • 不是默认 → 同一个槽位显示「设为默认」按钮

状态在哪显示,控件就在哪。

clickAction:不弹确认,所以事务里没有 state 驱动的 UI 要等(无死锁风险),pending 态自带。失败时 toast 报错、状态不动,按钮留在原地可重试。

命令面板入口保留——它从来没错,只是看不见。

验证

真机 e2e 跑通两态并确认交互闭环:

  • 清掉默认后进详情:按钮出现(1)
  • 点击后:按钮消失(0),Badge 就地接替(+1)

截图两张(按钮态 / Badge 态)已发任务线程。typecheck(我的文件)/ lint / format 全绿;ProvidersPanel 相关 e2e 断言扫过,只有「默认模型」那组,和本改动的「默认连接」是两个概念,无碰撞。

一处留给设计裁定

spec 第 3 条要求"不可设默认时按钮禁用且说明原因"——我查了后端,connections:setDefault 只在连接不存在时报错,没有任何可用性/凭据门槛,任何存在的连接都能设默认。所以没有可禁用的条件,我没有发明一个。要不要给"连接不可用时设默认"加护栏,是产品判断。

Closes#158.
Changing the default connection was possible only from the command palette.
The models page displayed a 默认 Badge on whichever connection held it and
offered no way to change it — so a user who went looking where the answer is
shown found a read-only label. One of them said so: "这默认模型连接改不了吗,
在模型里找半天." They were looking in exactly the right place.
The badge slot in the connection detail header now carries both halves of the
same fact: the default connection shows the Badge, and any other connection
shows a 设为默认 button in its place. Whichever a connection is, that slot
tells you — and is how you change it.
`clickAction` rather than onClick: this opens no confirmation, so there is no
state-driven UI to await inside the transition, and the pending affordance
comes with it. On failure the toast reports and the state does not move, which
leaves the button where it was to retry.
The command palette entry stays. It was never wrong, only invisible.
Review caught that ghost was the wrong variant here. A ghost button alone
beside a title is bare text, which reads as a subtitle rather than something
pressable — recreating the exact problem this change exists to solve, on the
one surface where a user has already demonstrated that not-obvious means
not-found.
secondary sm matches 测试连接 directly below it, which is this page's dialect
for a quiet but unmistakable control.
@jackwener

Copy link
Copy Markdown
MemberAuthor

Review by maka-审美专家 — 通过:「设为默认」控件落地在状态显示的同一槽位(控件贴对象法则),secondary sm 与同页 测试连接 同方言(首版 ghost 读作文字标签的问题经截图证实后改判,变体取舍理由留注释防回改);交互闭环以计数断言实证(按钮 1→0、Badge 0→1);护栏不加的裁定成立——禁用态自述规矩管已存在的禁用态,不发明禁用条件;命令面板入口保留。CI 绿。合入。

@jackwener
jackwener merged commit b2dff0b into mainAug 7, 2026
12 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(settings): let the models page set the default connection - #2421

Merged
jackwener merged 2 commits into
mainfrom
pr-set-default-connection-20
Aug 7, 2026
Merged

fix(settings): let the models page set the default connection#2421
jackwener merged 2 commits into
mainfrom
pr-set-default-connection-20

Conversation

@jackwener

Copy link
Copy Markdown
Member

Closes#158

问题

换默认连接只能从命令面板(⌘K)。模型页在默认连接上挂着「默认」Badge——状态看得见,控件不存在。用户反馈原话:「这默认模型连接改不了吗,在模型里找半天」——他找的地方是对的,是界面把路堵死了。

改法

连接详情头部那个槽位现在同时承担一件事的两面:

  • 是默认 → 显示「默认」Badge(不变)
  • 不是默认 → 同一个槽位显示「设为默认」按钮

状态在哪显示,控件就在哪。

clickAction:不弹确认,所以事务里没有 state 驱动的 UI 要等(无死锁风险),pending 态自带。失败时 toast 报错、状态不动,按钮留在原地可重试。

命令面板入口保留——它从来没错,只是看不见。

验证

真机 e2e 跑通两态并确认交互闭环:

  • 清掉默认后进详情:按钮出现(1)
  • 点击后:按钮消失(0),Badge 就地接替(+1)

截图两张(按钮态 / Badge 态)已发任务线程。typecheck(我的文件)/ lint / format 全绿;ProvidersPanel 相关 e2e 断言扫过,只有「默认模型」那组,和本改动的「默认连接」是两个概念,无碰撞。

一处留给设计裁定

spec 第 3 条要求"不可设默认时按钮禁用且说明原因"——我查了后端,connections:setDefault 只在连接不存在时报错,没有任何可用性/凭据门槛,任何存在的连接都能设默认。所以没有可禁用的条件,我没有发明一个。要不要给"连接不可用时设默认"加护栏,是产品判断。

Closes#158.
Changing the default connection was possible only from the command palette.
The models page displayed a 默认 Badge on whichever connection held it and
offered no way to change it — so a user who went looking where the answer is
shown found a read-only label. One of them said so: "这默认模型连接改不了吗,
在模型里找半天." They were looking in exactly the right place.
The badge slot in the connection detail header now carries both halves of the
same fact: the default connection shows the Badge, and any other connection
shows a 设为默认 button in its place. Whichever a connection is, that slot
tells you — and is how you change it.
`clickAction` rather than onClick: this opens no confirmation, so there is no
state-driven UI to await inside the transition, and the pending affordance
comes with it. On failure the toast reports and the state does not move, which
leaves the button where it was to retry.
The command palette entry stays. It was never wrong, only invisible.
Review caught that ghost was the wrong variant here. A ghost button alone
beside a title is bare text, which reads as a subtitle rather than something
pressable — recreating the exact problem this change exists to solve, on the
one surface where a user has already demonstrated that not-obvious means
not-found.
secondary sm matches 测试连接 directly below it, which is this page's dialect
for a quiet but unmistakable control.
@jackwener

Copy link
Copy Markdown
MemberAuthor

Review by maka-审美专家 — 通过:「设为默认」控件落地在状态显示的同一槽位(控件贴对象法则),secondary sm 与同页 测试连接 同方言(首版 ghost 读作文字标签的问题经截图证实后改判,变体取舍理由留注释防回改);交互闭环以计数断言实证(按钮 1→0、Badge 0→1);护栏不加的裁定成立——禁用态自述规矩管已存在的禁用态,不发明禁用条件;命令面板入口保留。CI 绿。合入。

@jackwener
jackwener merged commit b2dff0b into mainAug 7, 2026
12 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(settings): let the models page set the default connection - #2421

Merged
jackwener merged 2 commits into
mainfrom
pr-set-default-connection-20
Aug 7, 2026
Merged

fix(settings): let the models page set the default connection#2421
jackwener merged 2 commits into
mainfrom
pr-set-default-connection-20

Conversation

@jackwener

Copy link
Copy Markdown
Member

Closes#158

问题

换默认连接只能从命令面板(⌘K)。模型页在默认连接上挂着「默认」Badge——状态看得见,控件不存在。用户反馈原话:「这默认模型连接改不了吗,在模型里找半天」——他找的地方是对的,是界面把路堵死了。

改法

连接详情头部那个槽位现在同时承担一件事的两面:

  • 是默认 → 显示「默认」Badge(不变)
  • 不是默认 → 同一个槽位显示「设为默认」按钮

状态在哪显示,控件就在哪。

clickAction:不弹确认,所以事务里没有 state 驱动的 UI 要等(无死锁风险),pending 态自带。失败时 toast 报错、状态不动,按钮留在原地可重试。

命令面板入口保留——它从来没错,只是看不见。

验证

真机 e2e 跑通两态并确认交互闭环:

  • 清掉默认后进详情:按钮出现(1)
  • 点击后:按钮消失(0),Badge 就地接替(+1)

截图两张(按钮态 / Badge 态)已发任务线程。typecheck(我的文件)/ lint / format 全绿;ProvidersPanel 相关 e2e 断言扫过,只有「默认模型」那组,和本改动的「默认连接」是两个概念,无碰撞。

一处留给设计裁定

spec 第 3 条要求"不可设默认时按钮禁用且说明原因"——我查了后端,connections:setDefault 只在连接不存在时报错,没有任何可用性/凭据门槛,任何存在的连接都能设默认。所以没有可禁用的条件,我没有发明一个。要不要给"连接不可用时设默认"加护栏,是产品判断。

Closes#158.
Changing the default connection was possible only from the command palette.
The models page displayed a 默认 Badge on whichever connection held it and
offered no way to change it — so a user who went looking where the answer is
shown found a read-only label. One of them said so: "这默认模型连接改不了吗,
在模型里找半天." They were looking in exactly the right place.
The badge slot in the connection detail header now carries both halves of the
same fact: the default connection shows the Badge, and any other connection
shows a 设为默认 button in its place. Whichever a connection is, that slot
tells you — and is how you change it.
`clickAction` rather than onClick: this opens no confirmation, so there is no
state-driven UI to await inside the transition, and the pending affordance
comes with it. On failure the toast reports and the state does not move, which
leaves the button where it was to retry.
The command palette entry stays. It was never wrong, only invisible.
Review caught that ghost was the wrong variant here. A ghost button alone
beside a title is bare text, which reads as a subtitle rather than something
pressable — recreating the exact problem this change exists to solve, on the
one surface where a user has already demonstrated that not-obvious means
not-found.
secondary sm matches 测试连接 directly below it, which is this page's dialect
for a quiet but unmistakable control.
@jackwener

Copy link
Copy Markdown
MemberAuthor

Review by maka-审美专家 — 通过:「设为默认」控件落地在状态显示的同一槽位(控件贴对象法则),secondary sm 与同页 测试连接 同方言(首版 ghost 读作文字标签的问题经截图证实后改判,变体取舍理由留注释防回改);交互闭环以计数断言实证(按钮 1→0、Badge 0→1);护栏不加的裁定成立——禁用态自述规矩管已存在的禁用态,不发明禁用条件;命令面板入口保留。CI 绿。合入。

@jackwener
jackwener merged commit b2dff0b into mainAug 7, 2026
12 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(settings): let the models page set the default connection - #2421

Merged
jackwener merged 2 commits into
mainfrom
pr-set-default-connection-20
Aug 7, 2026
Merged

fix(settings): let the models page set the default connection#2421
jackwener merged 2 commits into
mainfrom
pr-set-default-connection-20

Conversation

@jackwener

Copy link
Copy Markdown
Member

Closes#158

问题

换默认连接只能从命令面板(⌘K)。模型页在默认连接上挂着「默认」Badge——状态看得见,控件不存在。用户反馈原话:「这默认模型连接改不了吗,在模型里找半天」——他找的地方是对的,是界面把路堵死了。

改法

连接详情头部那个槽位现在同时承担一件事的两面:

  • 是默认 → 显示「默认」Badge(不变)
  • 不是默认 → 同一个槽位显示「设为默认」按钮

状态在哪显示,控件就在哪。

clickAction:不弹确认,所以事务里没有 state 驱动的 UI 要等(无死锁风险),pending 态自带。失败时 toast 报错、状态不动,按钮留在原地可重试。

命令面板入口保留——它从来没错,只是看不见。

验证

真机 e2e 跑通两态并确认交互闭环:

  • 清掉默认后进详情:按钮出现(1)
  • 点击后:按钮消失(0),Badge 就地接替(+1)

截图两张(按钮态 / Badge 态)已发任务线程。typecheck(我的文件)/ lint / format 全绿;ProvidersPanel 相关 e2e 断言扫过,只有「默认模型」那组,和本改动的「默认连接」是两个概念,无碰撞。

一处留给设计裁定

spec 第 3 条要求"不可设默认时按钮禁用且说明原因"——我查了后端,connections:setDefault 只在连接不存在时报错,没有任何可用性/凭据门槛,任何存在的连接都能设默认。所以没有可禁用的条件,我没有发明一个。要不要给"连接不可用时设默认"加护栏,是产品判断。

Closes#158.
Changing the default connection was possible only from the command palette.
The models page displayed a 默认 Badge on whichever connection held it and
offered no way to change it — so a user who went looking where the answer is
shown found a read-only label. One of them said so: "这默认模型连接改不了吗,
在模型里找半天." They were looking in exactly the right place.
The badge slot in the connection detail header now carries both halves of the
same fact: the default connection shows the Badge, and any other connection
shows a 设为默认 button in its place. Whichever a connection is, that slot
tells you — and is how you change it.
`clickAction` rather than onClick: this opens no confirmation, so there is no
state-driven UI to await inside the transition, and the pending affordance
comes with it. On failure the toast reports and the state does not move, which
leaves the button where it was to retry.
The command palette entry stays. It was never wrong, only invisible.
Review caught that ghost was the wrong variant here. A ghost button alone
beside a title is bare text, which reads as a subtitle rather than something
pressable — recreating the exact problem this change exists to solve, on the
one surface where a user has already demonstrated that not-obvious means
not-found.
secondary sm matches 测试连接 directly below it, which is this page's dialect
for a quiet but unmistakable control.
@jackwener

Copy link
Copy Markdown
MemberAuthor

Review by maka-审美专家 — 通过:「设为默认」控件落地在状态显示的同一槽位(控件贴对象法则),secondary sm 与同页 测试连接 同方言(首版 ghost 读作文字标签的问题经截图证实后改判,变体取舍理由留注释防回改);交互闭环以计数断言实证(按钮 1→0、Badge 0→1);护栏不加的裁定成立——禁用态自述规矩管已存在的禁用态,不发明禁用条件;命令面板入口保留。CI 绿。合入。

@jackwener
jackwener merged commit b2dff0b into mainAug 7, 2026
12 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jackwener
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(settings): let the models page set the default connection - #2421

Merged
jackwener merged 2 commits into
mainfrom
pr-set-default-connection-20
Aug 7, 2026
Merged

fix(settings): let the models page set the default connection#2421
jackwener merged 2 commits into
mainfrom
pr-set-default-connection-20

Conversation

@jackwener

Copy link
Copy Markdown
Member

Closes#158

问题

换默认连接只能从命令面板(⌘K)。模型页在默认连接上挂着「默认」Badge——状态看得见,控件不存在。用户反馈原话:「这默认模型连接改不了吗,在模型里找半天」——他找的地方是对的,是界面把路堵死了。

改法

连接详情头部那个槽位现在同时承担一件事的两面:

  • 是默认 → 显示「默认」Badge(不变)
  • 不是默认 → 同一个槽位显示「设为默认」按钮

状态在哪显示,控件就在哪。

clickAction:不弹确认,所以事务里没有 state 驱动的 UI 要等(无死锁风险),pending 态自带。失败时 toast 报错、状态不动,按钮留在原地可重试。

命令面板入口保留——它从来没错,只是看不见。

验证

真机 e2e 跑通两态并确认交互闭环:

  • 清掉默认后进详情:按钮出现(1)
  • 点击后:按钮消失(0),Badge 就地接替(+1)

截图两张(按钮态 / Badge 态)已发任务线程。typecheck(我的文件)/ lint / format 全绿;ProvidersPanel 相关 e2e 断言扫过,只有「默认模型」那组,和本改动的「默认连接」是两个概念,无碰撞。

一处留给设计裁定

spec 第 3 条要求"不可设默认时按钮禁用且说明原因"——我查了后端,connections:setDefault 只在连接不存在时报错,没有任何可用性/凭据门槛,任何存在的连接都能设默认。所以没有可禁用的条件,我没有发明一个。要不要给"连接不可用时设默认"加护栏,是产品判断。

Closes#158.
Changing the default connection was possible only from the command palette.
The models page displayed a 默认 Badge on whichever connection held it and
offered no way to change it — so a user who went looking where the answer is
shown found a read-only label. One of them said so: "这默认模型连接改不了吗,
在模型里找半天." They were looking in exactly the right place.
The badge slot in the connection detail header now carries both halves of the
same fact: the default connection shows the Badge, and any other connection
shows a 设为默认 button in its place. Whichever a connection is, that slot
tells you — and is how you change it.
`clickAction` rather than onClick: this opens no confirmation, so there is no
state-driven UI to await inside the transition, and the pending affordance
comes with it. On failure the toast reports and the state does not move, which
leaves the button where it was to retry.
The command palette entry stays. It was never wrong, only invisible.
Review caught that ghost was the wrong variant here. A ghost button alone
beside a title is bare text, which reads as a subtitle rather than something
pressable — recreating the exact problem this change exists to solve, on the
one surface where a user has already demonstrated that not-obvious means
not-found.
secondary sm matches 测试连接 directly below it, which is this page's dialect
for a quiet but unmistakable control.
@jackwener

Copy link
Copy Markdown
MemberAuthor

Review by maka-审美专家 — 通过:「设为默认」控件落地在状态显示的同一槽位(控件贴对象法则),secondary sm 与同页 测试连接 同方言(首版 ghost 读作文字标签的问题经截图证实后改判,变体取舍理由留注释防回改);交互闭环以计数断言实证(按钮 1→0、Badge 0→1);护栏不加的裁定成立——禁用态自述规矩管已存在的禁用态,不发明禁用条件;命令面板入口保留。CI 绿。合入。

@jackwener
jackwener merged commit b2dff0b into mainAug 7, 2026
12 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jackwener