{#snippet actions()} (tab = v as 'users' | 'invites' | 'audit')}> 用户 邀请与恢复 审计日志 {/snippet}
{#if tab === 'users'}

用户

{#if !usersBusy && !usersErr && users.length > 0} 邮箱 姓名 角色 状态 AI 权限 日回测上限 操作 {#each users as u (u.id)} {u.email} {u.name} void patchUser(u, { role: v as 'admin' | 'member' })} > {u.role === 'admin' ? '管理员' : '成员'} 成员 管理员 {u.active ? '启用' : '停用'} void patchUser(u, { daily_run_limit: Number((e.target as HTMLInputElement).value) })} />
{/each}
{/if}

停用账户会立即吊销其会话并阻止其回测与 AI 请求。角色不能作用于他人项目,私阅策略代码不提供。

{:else if tab === 'invites'}

签发邀请

{#if newInvite}
邀请令牌(只显示这一次,请立即复制):
{newInvite.token}
到期:{fmtDateTime(newInvite.expires_at)} · 单次使用 · 注册页链接:
{inviteUrl}
{/if}

历史邀请

{#if !inviteBusy && !inviteErr && invites.length === 0} {/if} {#if !inviteBusy && invites.length > 0} 邮箱备注 角色 创建时间 过期 状态 {#each invites as inv (inv.id)} {inv.email ?? '—'} {inv.role === 'admin' ? '管理员' : '成员'} {fmtDateTime(inv.created_at)} {fmtDateTime(inv.expires_at)} {#if inv.used_at}已使用 {:else if inv.revoked}已撤销 {:else if inv.expires_at && new Date(inv.expires_at) < new Date()}已过期 {:else}有效 {/if} {#if !inv.used_at && !inv.revoked} {/if} {/each} {/if}

恢复链接由“生成恢复”按钮产生,仅出现一次;不会自动发邮件。

{:else}

安全审计(收尾尾部)

{#if !auditBusy && !auditErr && audit.length === 0} {/if} {#if !auditBusy && audit.length > 0} 时间 行为者 事件 对象 结果 {#each audit as e, i (i)} {fmtDateTime(e.time)} {e.actor ?? '—'} {e.action} {e.target ?? '—'} {e.status} {/each} {/if}

审计仅记录操作行为与结果,不含密码/密钥/策略代码内容。

{/if}
{#if resetFor} (resetFor = null)}>
恢复链接(管理员线下告知对方,只出现一次):
{resetUrl}
令牌 {resetToken.slice(0, 8)}… 会即刻失效前提示时间(见链接有效期)。

单次有效、限时;重置会吊销对方的全部历史会话。

{/if}