fix: remove redundant permission timing hints

This commit is contained in:
Codex committed 2026-10-21 19:01:18 +09:00
1 parent 3e62385a2f
commit a19ca04061
2 files changed
+7 -7

No files matched your search

@@ -6,9 +6,10 @@ for (const mode of ['default-sandbox', 'full-access'] as const) {
const render = (nextSend: boolean, disabled = false) => renderToStaticMarkup(<SourcePermissionControl const render = (nextSend: boolean, disabled = false) => renderToStaticMarkup(<SourcePermissionControl
mode={mode} nextSend={nextSend} disabled={disabled} onChange={async () => { throw new Error('render must not mutate policy') }} onError={() => {}} />) mode={mode} nextSend={nextSend} disabled={disabled} onChange={async () => { throw new Error('render must not mutate policy') }} onError={() => {}} />)
const busy = render(true) const busy = render(true)
assert.ok(busy.includes('下次发送生效'), 'busy selector must identify future policy, not claim current policy changed') assert.ok(!busy.includes('下次发送生效'), 'busy selector must not add a timing hint')
assert.equal(busy, render(false), 'busy and idle permission selectors must have identical labels and markup')
assert.ok(!busy.includes('disabled=""'), 'a running/sending turn must not disable preference selection') assert.ok(!busy.includes('disabled=""'), 'a running/sending turn must not disable preference selection')
assert.ok(!render(false).includes('下次发送生效')) assert.ok(!render(false).includes('下次发送生效'))
assert.ok(render(true, true).includes('disabled=""'), 'plan/ask and load guards remain enforceable') assert.ok(render(true, true).includes('disabled=""'), 'plan/ask and load guards remain enforceable')
} }
console.log('Next-send permission labels and enabled/disabled static rendering passed') console.log('Permission labels stay concise across busy/idle states; enabled/disabled static rendering passed')
@@ -31,7 +31,7 @@ interface Props {
* The source panel has one full-access switch, not a two-option permission list. * The source panel has one full-access switch, not a two-option permission list.
* Its checkbox acknowledges risk; it does not change the global confirmation preference. * Its checkbox acknowledges risk; it does not change the global confirmation preference.
*/ */
export default function SourcePermissionControl({ mode, nextSend, disabled, disabledReason, labels, confirmFullAccessOnChange = true, onChange, onError }: Props): React.JSX.Element { export default function SourcePermissionControl({ mode, disabled, disabledReason, labels, confirmFullAccessOnChange = true, onChange, onError }: Props): React.JSX.Element {
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
const [confirming, setConfirming] = useState(false) const [confirming, setConfirming] = useState(false)
const [acknowledged, setAcknowledged] = useState(false) const [acknowledged, setAcknowledged] = useState(false)
@@ -45,8 +45,7 @@ export default function SourcePermissionControl({ mode, nextSend, disabled, disa
if (disabled) { setOpen(false); setConfirming(false); setAcknowledged(false) } if (disabled) { setOpen(false); setConfirming(false); setAcknowledged(false) }
}, [disabled]) }, [disabled])
const full = mode === 'full-access' const full = mode === 'full-access'
const modeLabel = labels?.[mode] ?? t(full ? 'chatInput.permission.fullAccess' : 'chatInput.permission.label') const label = labels?.[mode] ?? t(full ? 'chatInput.permission.fullAccess' : 'chatInput.permission.label')
const label = nextSend ? `${modeLabel} · 下次发送生效` : modeLabel
useEffect(() => { useEffect(() => {
const observer = new MutationObserver(() => setTheme(document.documentElement.dataset.theme === 'dark' ? 'dark' : 'light')) const observer = new MutationObserver(() => setTheme(document.documentElement.dataset.theme === 'dark' ? 'dark' : 'light'))
observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] }) observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] })
@@ -96,7 +95,7 @@ export default function SourcePermissionControl({ mode, nextSend, disabled, disa
> >
<div className="yc-source-model-selector yc-source-permission cr-theme" data-cr-theme={theme} data-theme={theme}> <div className="yc-source-model-selector yc-source-permission cr-theme" data-cr-theme={theme} data-theme={theme}>
<div className="cr-permission-panel wb-composer__permission-menu" role="menu" aria-label="权限设置"> <div className="cr-permission-panel wb-composer__permission-menu" role="menu" aria-label="权限设置">
<div className="cr-permission-panel__desc">{nextSend && <p>下次发送生效,不影响当前运行、待处理授权或已排队消息。</p>}{full ? t('chatInput.permission.description.fullAccess') <div className="cr-permission-panel__desc">{full ? t('chatInput.permission.description.fullAccess')
: t('chatInput.permission.description.default').replace('安全沙箱', '默认权限')}</div> : t('chatInput.permission.description.default').replace('安全沙箱', '默认权限')}</div>
<div className="cr-permission-panel__divider" role="separator" /> <div className="cr-permission-panel__divider" role="separator" />
<div className="cr-permission-panel__group"> <div className="cr-permission-panel__group">
@@ -131,7 +130,7 @@ export default function SourcePermissionControl({ mode, nextSend, disabled, disa
<span className="permission-confirm-icon"><ShieldErrorIcon /></span><h2 className="wb-modal__title" id={`${id}-title`}>{t('chatInput.permission.confirm.title')}</h2> <span className="permission-confirm-icon"><ShieldErrorIcon /></span><h2 className="wb-modal__title" id={`${id}-title`}>{t('chatInput.permission.confirm.title')}</h2>
</div></div></div> </div></div></div>
<div className="wb-modal__body cr-permission-confirm__modal-body"> <div className="wb-modal__body cr-permission-confirm__modal-body">
<div className="cr-permission-confirm__desc" id={`${id}-description`}>{t('chatInput.permission.confirm.desc').replace('所有任务', nextSend ? '下次发送的任务(不影响当前运行或授权)' : '之后发送的任务')}</div> <div className="cr-permission-confirm__desc" id={`${id}-description`}>{t('chatInput.permission.confirm.desc').replace('所有任务', '之后发送的任务')}</div>
<div className="cr-permission-confirm__capabilities">{([ <div className="cr-permission-confirm__capabilities">{([
['folder', 'files'], ['terminal', 'terminal'], ['website', 'internet'] ['folder', 'files'], ['terminal', 'terminal'], ['website', 'internet']
] as const).map(([icon, key]) => <div key={key} className="cr-permission-confirm__capability-item"> ] as const).map(([icon, key]) => <div key={key} className="cr-permission-confirm__capability-item">