mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-09 20:50:20 +08:00
304 lines
20 KiB
HTML
304 lines
20 KiB
HTML
<!doctype html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||
<meta name="color-scheme" content="dark light" />
|
||
<title>Codex</title>
|
||
<link rel="stylesheet" href="./style.css" />
|
||
</head>
|
||
<body class="codex-app local-no-auth">
|
||
<div class="codex-panel">
|
||
<div class="connection" aria-live="polite" hidden>
|
||
<span id="connectionDot" class="dot offline"></span>
|
||
<span id="connectionText">正在连接</span>
|
||
<span id="roleBadge" class="badge">未认证</span>
|
||
</div>
|
||
<main class="chat-shell">
|
||
<section class="chat-header" aria-label="当前会话">
|
||
<div class="thread-heading">
|
||
<button id="backButton" class="icon-button header-back-button" type="button" data-panel-action="back" title="返回会话列表" aria-label="返回会话列表" hidden>
|
||
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M9.75 3.5 5.25 8l4.5 4.5M5.5 8h6.25" /></svg>
|
||
</button>
|
||
<button id="sessionPickerButton" class="thread-picker-button" type="button" aria-haspopup="dialog" aria-expanded="false" title="打开会话历史" aria-label="打开会话历史" disabled>
|
||
<h2 id="threadTitle">Codex</h2>
|
||
</button>
|
||
<span id="appState" class="status-text" aria-live="polite">等待 VS Code 主机</span>
|
||
</div>
|
||
<div class="thread-actions">
|
||
<button class="icon-button" type="button" data-panel-action="menu" title="更多操作" aria-label="更多操作">
|
||
<svg viewBox="0 0 16 16" aria-hidden="true"><circle cx="3" cy="8" r="1" /><circle cx="8" cy="8" r="1" /><circle cx="13" cy="8" r="1" /></svg>
|
||
</button>
|
||
<button id="historyButton" class="icon-button header-history-button" type="button" data-panel-action="history" title="会话历史" aria-label="会话历史" hidden>
|
||
<svg viewBox="0 0 20 20" aria-hidden="true"><path d="M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" /><path d="M3 3v5h5" /><path d="M12 7v5l4 2" /></svg>
|
||
</button>
|
||
<button class="icon-button" type="button" data-panel-action="settings" title="设置" aria-label="设置">
|
||
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M6.7 2h2.6l.4 1.6c.4.2.8.4 1.2.7l1.6-.6 1.3 2.2-1.2 1.1a5 5 0 0 1 0 1.4l1.2 1.1-1.3 2.2-1.6-.6c-.4.3-.8.5-1.2.7L9.3 14H6.7l-.4-1.6a5 5 0 0 1-1.2-.7l-1.6.6-1.3-2.2 1.2-1.1a5 5 0 0 1 0-1.4L2.2 6l1.3-2.2 1.6.6c.4-.3.8-.5 1.2-.7L6.7 2Z" /><circle cx="8" cy="8" r="1.7" /></svg>
|
||
</button>
|
||
<button id="newSessionButton" class="icon-button new-session-button" type="button" data-panel-action="new-session" title="创建新会话" aria-label="创建新会话" hidden>
|
||
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M3.25 3.25h5.5a1.5 1.5 0 0 1 1.5 1.5v2.5" /><path d="M3.25 3.25v9.5h6" /><path d="m8.2 11.35 4.55-4.55 1.25 1.25-4.55 4.55-2 .5Z" /></svg>
|
||
</button>
|
||
</div>
|
||
</section>
|
||
<div id="panelMenu" class="panel-popover panel-menu" hidden>
|
||
<button type="button" data-menu-action="sessions" hidden>最近会话</button>
|
||
<button type="button" data-menu-action="clear">清空当前输出</button>
|
||
<button type="button" data-menu-action="refresh">重新同步</button>
|
||
<button type="button" data-menu-action="expand">展开面板</button>
|
||
<button type="button" data-menu-action="close">隐藏面板</button>
|
||
</div>
|
||
<div id="detailsPopover" class="panel-popover details-popover settings-popover" hidden role="dialog" aria-label="设置">
|
||
<div class="popover-title">设置</div>
|
||
<div class="settings-shortcuts">
|
||
<button type="button" data-settings-action="model"><span>模型与推理强度</span><span id="settingsModelValue">默认</span></button>
|
||
<button type="button" data-settings-action="permission"><span>修改权限</span><span id="settingsPermissionValue">工作区写入</span></button>
|
||
<label id="localeSetting" class="settings-locale">
|
||
<span>语言</span>
|
||
<select id="localeSelect" aria-label="语言">
|
||
<option value="zh-CN">中文</option>
|
||
<option value="en-US">English</option>
|
||
</select>
|
||
</label>
|
||
</div>
|
||
<div class="settings-divider"></div>
|
||
<div class="popover-subtitle">当前会话</div>
|
||
<dl>
|
||
<dt>工作区</dt><dd id="popoverCwd">-</dd>
|
||
<dt>模式</dt><dd id="popoverMode">本地模式</dd>
|
||
<dt>thread</dt><dd id="popoverThread">-</dd>
|
||
</dl>
|
||
</div>
|
||
<div id="sessionPicker" class="panel-popover session-picker" hidden role="dialog" aria-label="最近会话">
|
||
<div class="session-picker-header">
|
||
<span class="popover-title">最近会话</span>
|
||
<button id="sessionPickerRefresh" class="session-picker-refresh" type="button" title="刷新会话列表" aria-label="刷新会话列表">
|
||
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M13 5V2m0 0h-3m3 0-2.1 2.1A5 5 0 1 0 13 9" /></svg>
|
||
</button>
|
||
</div>
|
||
<div class="session-search">
|
||
<svg viewBox="0 0 16 16" aria-hidden="true"><circle cx="6.8" cy="6.8" r="3.8" /><path d="m9.7 9.7 3.2 3.2" /></svg>
|
||
<label class="sr-only" for="sessionSearchInput">搜索最近会话</label>
|
||
<input id="sessionSearchInput" type="search" autocomplete="off" spellcheck="false" placeholder="搜索最近会话" aria-label="搜索最近会话" aria-controls="sessionList" aria-expanded="false" />
|
||
<button id="sessionSearchClear" class="session-search-clear" type="button" title="清除搜索" aria-label="清除搜索" hidden>
|
||
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="m4.5 4.5 7 7m0-7-7 7" /></svg>
|
||
</button>
|
||
</div>
|
||
<div id="sessionPickerStatus" class="session-picker-status" role="status" aria-live="polite"></div>
|
||
<div id="sessionList" class="session-list" role="listbox" aria-label="可用会话" tabindex="0"></div>
|
||
</div>
|
||
|
||
<section class="chat-panel" aria-label="对话内容">
|
||
<div id="output" class="output chat-scroll" tabindex="0" aria-live="polite" aria-label="Codex 消息"></div>
|
||
<button id="scrollToBottom" class="scroll-to-bottom" type="button" aria-label="回到最新消息" aria-hidden="true" tabindex="-1">
|
||
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 3v9M4.5 8.5 8 12l3.5-3.5" /></svg>
|
||
<span class="scroll-working-dots" aria-hidden="true"><i></i><i></i><i></i></span>
|
||
</button>
|
||
<div id="inlineRequests" class="inline-requests" aria-live="polite" aria-label="待处理的 Codex 请求"></div>
|
||
</section>
|
||
|
||
<section id="messageForm" class="composer" aria-label="发送消息">
|
||
<section id="subagentsPanel" class="subagents-panel" aria-label="子代理" hidden>
|
||
<button id="subagentsToggle" class="subagents-toggle" type="button" aria-expanded="false">
|
||
<span class="subagents-title">子代理</span>
|
||
<span id="subagentsCount" class="subagents-count"></span>
|
||
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="m6 3 5 5-5 5" /></svg>
|
||
</button>
|
||
<div id="subagentsList" class="subagents-list"></div>
|
||
</section>
|
||
<div id="liveActivity" class="live-activity" role="status" aria-live="polite" hidden>
|
||
<span class="activity-spinner" aria-hidden="true"></span>
|
||
<span class="activity-label"></span>
|
||
<span class="activity-dots" aria-hidden="true"><i></i><i></i><i></i></span>
|
||
<span class="activity-elapsed"></span>
|
||
</div>
|
||
<div class="composer-surface">
|
||
<div
|
||
id="messageInput"
|
||
class="composer-editor"
|
||
contenteditable="true"
|
||
role="textbox"
|
||
aria-multiline="true"
|
||
data-placeholder="提交后续变更要求"
|
||
spellcheck="true"
|
||
></div>
|
||
<div class="composer-footer">
|
||
<div class="composer-hint">
|
||
<button id="composerPlusButton" class="composer-icon-button" type="button" aria-haspopup="menu" aria-expanded="false" title="添加文件及更多内容" aria-label="添加文件及更多内容">
|
||
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 3v10M3 8h10" /></svg>
|
||
</button>
|
||
<div id="composerPlusMenu" class="composer-popover composer-plus-menu" role="menu" hidden>
|
||
<div class="composer-popover-heading">添加文件及更多内容</div>
|
||
<button type="button" role="menuitem" data-composer-action="attach">添加文件</button>
|
||
<button type="button" role="menuitem" data-composer-action="photo">添加照片</button>
|
||
<button type="button" role="menuitem" data-composer-action="workspace">添加工作区上下文</button>
|
||
<button type="button" role="menuitem" data-composer-action="web-search">网页搜索</button>
|
||
</div>
|
||
<input id="attachmentInput" type="file" accept=".txt,.md,.json,.js,.ts,.tsx,.jsx,.css,.html,.yml,.yaml,.xml,.py,.go,.rs,.java,.c,.cpp,.h,image/*" multiple hidden />
|
||
<button id="permissionChip" class="permission-chip" type="button" aria-haspopup="menu" aria-expanded="false" title="修改权限" aria-label="修改权限">
|
||
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 1.8 13 4v3.6c0 3-2 5.6-5 6.6-3-1-5-3.6-5-6.6V4l5-2.2Z" /><path d="m5.5 8 1.6 1.6L10.8 6" /></svg>
|
||
<span id="permissionLabel">工作区写入</span>
|
||
<svg class="permission-chevron" viewBox="0 0 16 16" aria-hidden="true"><path d="m4.5 6 3.5 3.5L11.5 6" /></svg>
|
||
</button>
|
||
<div id="permissionMenu" class="composer-popover permission-menu" role="menu" aria-label="权限设置" hidden>
|
||
<div class="composer-popover-heading">修改权限</div>
|
||
<button type="button" role="menuitemradio" data-permission-mode="ask" aria-checked="false"><span>需要时询问</span><small>编辑外部文件和联网时始终询问</small></button>
|
||
<button type="button" role="menuitemradio" data-permission-mode="auto" aria-checked="false"><span>由 Codex 审批</span><small>仅对可能不安全的操作询问</small></button>
|
||
<button type="button" role="menuitemradio" data-permission-mode="full" aria-checked="false"><span>完全访问</span><small>不限制联网或文件访问</small></button>
|
||
<button type="button" role="menuitemradio" data-permission-mode="custom" aria-checked="false"><span>自定义</span><small>使用 config.toml 中的权限</small></button>
|
||
<button type="button" role="menuitemradio" data-permission-mode="readonly" aria-checked="false"><span>只读</span><small>仅查看文件,不修改工作区</small></button>
|
||
</div>
|
||
<div id="permissionConfirm" class="permission-confirm" role="dialog" aria-modal="true" aria-labelledby="permissionConfirmTitle" hidden>
|
||
<div id="permissionConfirmTitle" class="permission-confirm-title">确认完全访问</div>
|
||
<p>完全访问允许 Codex 执行命令、访问互联网并编辑工作区之外的文件。</p>
|
||
<div class="permission-confirm-actions">
|
||
<button id="permissionConfirmCancel" type="button">取消</button>
|
||
<button id="permissionConfirmAccept" class="primary" type="button">确认</button>
|
||
</div>
|
||
</div>
|
||
<div id="usagePicker" class="usage-picker" hidden>
|
||
<button id="usageButton" class="usage-button" type="button" aria-haspopup="dialog" aria-expanded="false" title="查看上下文用量" aria-label="查看上下文用量"><span id="usageRing" class="usage-ring" aria-hidden="true"><span id="usageLabel">0%</span></span></button>
|
||
<div id="usageMenu" class="composer-popover usage-menu" role="dialog" aria-label="上下文用量" hidden>
|
||
<div class="composer-popover-heading">上下文用量</div>
|
||
<div id="usageSummary" class="usage-summary">暂无用量数据</div>
|
||
<div class="usage-meter"><span id="usageMeterBar"></span></div>
|
||
<div id="usageDetails" class="usage-details"></div>
|
||
</div>
|
||
</div>
|
||
<span id="factApp" class="sr-only">-</span>
|
||
<span id="factClients" class="sr-only">-</span>
|
||
<span id="factRequests" class="sr-only">0</span>
|
||
</div>
|
||
<div class="composer-actions">
|
||
<div id="modelPicker" class="model-picker">
|
||
<button id="modelPickerButton" class="model-picker-button" type="button" aria-haspopup="menu" aria-expanded="false" title="切换模型与推理强度" hidden>
|
||
<span id="modelLabel" class="model-label"></span>
|
||
<span id="modelEffortLabel" class="model-effort-label"></span>
|
||
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="m4.5 6 3.5 3.5L11.5 6" /></svg>
|
||
</button>
|
||
<div id="modelMenu" class="model-menu" role="menu" aria-label="模型与推理强度" hidden>
|
||
<div id="modelPowerView" class="model-power-view">
|
||
<div class="model-power-heading">
|
||
<span>推理强度</span>
|
||
<button id="modelAdvancedToggle" class="model-advanced-toggle" type="button">高级</button>
|
||
</div>
|
||
<div class="model-power-control">
|
||
<span class="model-power-label">更高效</span>
|
||
<input id="modelPowerSlider" class="model-power-slider" type="range" min="0" max="3" step="1" value="1" aria-label="强度" aria-describedby="modelPowerInstructions" />
|
||
<span class="model-power-label">更智能</span>
|
||
</div>
|
||
<div id="modelPowerValue" class="model-power-value"></div>
|
||
<span id="modelPowerInstructions" class="sr-only">使用左右方向键调整强度</span>
|
||
</div>
|
||
<div id="modelAdvancedView" class="model-advanced-view" hidden>
|
||
<div class="model-advanced-toolbar">
|
||
<button id="modelAdvancedBack" class="model-advanced-back" type="button" aria-label="返回模型强度">‹</button>
|
||
<span>模型与推理强度</span>
|
||
</div>
|
||
<div class="model-menu-heading">模型</div>
|
||
<div id="modelOptions" class="model-options" role="listbox" aria-label="模型"></div>
|
||
<div class="model-menu-heading effort-heading">推理强度</div>
|
||
<div id="effortOptions" class="effort-options" role="listbox" aria-label="推理强度"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<button id="interruptButton" class="compact-action interrupt-action" type="button" disabled title="中断当前 turn" aria-label="中断当前 turn">
|
||
<svg viewBox="0 0 16 16" aria-hidden="true"><rect x="4.5" y="4.5" width="7" height="7" rx="1" /></svg>
|
||
</button>
|
||
<button id="steerButton" class="primary compact-action steer-action" type="button" disabled title="发送后续指令" aria-label="发送后续指令">
|
||
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 12V4M4.5 7.5 8 4l3.5 3.5" /></svg>
|
||
</button>
|
||
<button id="startTurnButton" class="primary send-button" type="button" disabled title="发送消息" aria-label="发送消息">
|
||
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 12V4M4.5 7.5 8 4l3.5 3.5" /></svg>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="mode-row">
|
||
<span class="connection-mode-label">
|
||
<svg class="mode-icon" viewBox="0 0 16 16" aria-hidden="true"><rect x="2" y="3" width="12" height="8" rx="1" /><path d="M5 13h6M8 11v2" /></svg>
|
||
<span id="modeLabel">本地模式</span>
|
||
</span>
|
||
<div id="controlModeSwitch" class="control-mode-switch" role="group" aria-label="控制模式" aria-busy="false" data-mode="sync" data-switching="false">
|
||
<button type="button" data-control-mode="sync" aria-pressed="true" title="同步模式跟随 VS Code 当前会话" disabled>同步</button>
|
||
<button type="button" data-control-mode="async" aria-pressed="false" title="异步模式可独立管理会话" disabled>异步</button>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</main>
|
||
</div>
|
||
<button id="restorePanel" class="restore-panel" type="button" hidden>显示 Codex</button>
|
||
|
||
<!-- Protocol compatibility state stays out of the visual shell. -->
|
||
<section class="compatibility-state" aria-hidden="true" hidden inert>
|
||
<details id="sessionSettings">
|
||
<summary>会话设置</summary>
|
||
<div class="settings-grid">
|
||
<label>工作目录<input id="cwdInput" type="text" /></label>
|
||
<label>模型<input id="modelInput" type="text" placeholder="留空使用默认模型" /></label>
|
||
<label>沙箱
|
||
<select id="sandboxInput">
|
||
<option value="workspace-write">workspace-write</option>
|
||
<option value="read-only">read-only</option>
|
||
<option value="danger-full-access">danger-full-access</option>
|
||
</select>
|
||
</label>
|
||
<label>审批策略
|
||
<select id="approvalInput">
|
||
<option value="on-request">on-request</option>
|
||
<option value="untrusted">untrusted</option>
|
||
<option value="never">never</option>
|
||
</select>
|
||
</label>
|
||
<button id="startThreadButton" class="secondary" type="button">启动新 thread</button>
|
||
<div class="ids">
|
||
<span>thread</span><code id="threadId">-</code>
|
||
<span>turn</span><code id="turnId">-</code>
|
||
</div>
|
||
</div>
|
||
</details>
|
||
<details id="connectionSettings">
|
||
<summary>连接设置</summary>
|
||
<label class="token-field">
|
||
<span id="tokenLabel">本机连接(无需 token)</span>
|
||
<input id="tokenInput" type="password" autocomplete="off" placeholder="本机模式无需填写;认证模式再填写" />
|
||
</label>
|
||
</details>
|
||
<span id="sessionMode">已附着当前会话</span>
|
||
<span id="latestSeq">seq -</span>
|
||
<span id="outputHint">等待连接</span>
|
||
<button id="clearOutputButton" type="button">清空对话</button>
|
||
<span id="lastEvent">-</span>
|
||
<details id="requestsPanel"><summary><span>授权与输入</span><span id="requestCount" class="badge warning">0</span></summary><div id="requests" class="requests empty">暂无待处理请求</div></details>
|
||
</section>
|
||
|
||
<template id="requestTemplate">
|
||
<article class="request">
|
||
<div class="request-title"><span class="request-icon" aria-hidden="true">!</span><strong class="request-method"></strong><span class="request-risk"></span><span class="request-id"></span></div>
|
||
<p class="request-summary"></p>
|
||
<pre class="request-command"></pre>
|
||
<div class="request-questions"></div>
|
||
<label class="request-scope-wrap" hidden>
|
||
<span>授权范围</span>
|
||
<select class="request-scope">
|
||
<option value="turn">仅本次 turn</option>
|
||
<option value="session">当前会话</option>
|
||
</select>
|
||
</label>
|
||
<details class="request-details">
|
||
<summary>查看请求数据</summary>
|
||
<pre class="request-json"></pre>
|
||
</details>
|
||
<textarea class="request-response" rows="4" aria-label="JSON 响应"></textarea>
|
||
<div class="button-row request-actions">
|
||
<button class="primary request-allow">允许</button>
|
||
<button class="secondary request-deny">拒绝</button>
|
||
<button class="secondary request-send">发送 JSON</button>
|
||
</div>
|
||
</article>
|
||
</template>
|
||
<script src="./embed-bridge.js" defer></script>
|
||
<script src="./i18n.js" defer></script>
|
||
<script src="./app.js" defer></script>
|
||
</body>
|
||
</html>
|