diff --git a/homepage/assets/style.css b/homepage/assets/style.css index 3139a0b..7d8f6a6 100644 --- a/homepage/assets/style.css +++ b/homepage/assets/style.css @@ -755,6 +755,129 @@ footer a:hover { color: var(--accent); } +/* ── 定价 / 授权页共享基础类 ─────────────────────── */ +/* Opsx 系列三站的 pricing.html / license.html 使用同一套标记(wrap / section / + sec-title / price-card / plan-tag / deal-note)。opsxdb、opsxapi 的 site.css + 原生带这些规则;本站 style.css 缺这一段,导致 /pricing 页内容贴左、价格卡 + 无卡片样式(2026-10-16 补齐,仅新增、不改动既有规则)。 // Logan.Li */ +.wrap { + max-width: 1080px; + margin: 0 auto; + padding: 0 24px; +} +.section { + padding: 74px 0; +} +.section.alt { + background: var(--bg-soft); + border-top: 1px solid var(--border); + border-bottom: 1px solid var(--border); +} +.sec-title { + font-size: 28px; + font-weight: 800; + text-align: center; + margin: 0 0 8px; +} +.sec-sub { + text-align: center; + color: var(--text-2); + font-size: 14.5px; + margin: 0 0 34px; +} +/* 价格卡(暗色主题版:--panel + --border,与本站整体一致) */ +.pricing.three { + max-width: 1080px; + margin: 0 auto; +} +.price-card { + position: relative; + background: var(--panel); + border: 1px solid var(--border); + border-radius: 16px; + padding: 28px 26px 24px; + display: flex; + flex-direction: column; +} +.price-card.featured { + border-color: rgba(85, 174, 242, 0.55); + background: linear-gradient(180deg, rgba(85, 174, 242, 0.08), var(--panel) 45%); +} +.price-card .plan { + background: none; + border: 0; + border-radius: 0; + padding: 0; + font-size: 15px; + font-weight: 700; + color: var(--text-2); +} +.price-card .plan-sub { + font-size: 12.5px; + color: var(--text-3); + margin: 2px 0 16px; +} +.price-card .price, +.price-card .price b { + font-size: 32px; + font-weight: 800; +} +.price-card .price { + margin: 8px 0 0; +} +.price-card .price span { + font-size: 13.5px; + font-weight: 400; + color: var(--text-3); + margin-left: 4px; +} +.price-card ul { + list-style: none; + display: grid; + gap: 8px; + margin: 6px 0 22px; + padding: 0; + flex: 1; +} +.price-card ul li { + font-size: 13.6px; + color: var(--text-2); + display: flex; + gap: 9px; +} +.price-card ul li::before { + content: '✓'; + color: var(--green); + font-weight: 700; + flex-shrink: 0; +} +.price-card .btn { + width: 100%; +} +.plan-tag { + position: absolute; + top: -12px; + left: 50%; + transform: translateX(-50%); + background: var(--accent); + color: #06121c; + font-size: 11.5px; + font-weight: 700; + padding: 3px 12px; + border-radius: 999px; + white-space: nowrap; +} +.deal-note { + font-size: 13px; + line-height: 1.9; + color: var(--text-3); + margin-top: 18px; +} +.footnote { + font-size: 13px; + color: var(--text-3); +} + /* ── Responsive ──────────────────────────────────── */ @media (max-width: 960px) { .hero-grid { diff --git a/homepage/dist/docs/quickstart/index.html b/homepage/dist/docs/quickstart/index.html index 08727e9..c3a1d97 100644 --- a/homepage/dist/docs/quickstart/index.html +++ b/homepage/dist/docs/quickstart/index.html @@ -87,7 +87,7 @@

使用指南

OpsXShell 主打简单好用:常用远程操作走短路径,高级选项默认收起。不做堡垒审计。

安装(macOS)

-

从 release/v*/macos-arm64/ 打开 .dmg,把 OpsXShell 拖到「应用程序」。Finder 里应是 Tauri 那套大图标布局(应用在左、Applications 在右)。已经 staple 的正式包一般可直接打开。

+

从官网下载,或打开本机构建产物 src-tauri/target/<triple>/release/bundle/dmg/ 里的 .dmg,把 OpsXShell 拖到「应用程序」。Finder 里应是 Tauri 那套大图标布局(应用在左、Applications 在右)。已经 staple 的正式包一般可直接打开。

自己改代码后重新打包:先 ./scripts/build.sh mac-arm64 --quick(本机有签名配置就会签 Developer ID),再 ./scripts/macos-notarize.sh(会要 App 专用密码)。新打的 DMG 在公证完成前仍会被 Gatekeeper 拦截。你现在要做的步骤见 发布指南。

快速连接

按 Cmd/Ctrl + K,输入 user@host 或 user@host:port 后连接。默认端口为 22。快速连接适合临时使用,不会自动保存会话。

diff --git a/homepage/dist/docs/search-data.json b/homepage/dist/docs/search-data.json index 306ffea..4b0edbe 100644 --- a/homepage/dist/docs/search-data.json +++ b/homepage/dist/docs/search-data.json @@ -1 +1 @@ -[{"Slug":"overview","Title":"概述","Group":"开始使用","Text":"OpsXShell 是什么 OpsXShell 是基于 Tauri 2 与 Rust 的 原生桌面 运维终端:SSH 多标签分屏、SFTP、端口转发、RDP/VNC、串口与可选终端 AI。 操作入口 :桌面客户端( ) 本站 :产品官网与文档( → Gin) 不做 :堡垒机、审计审批、浏览器里的终端工作台 下载与校验和见 。"},{"Slug":"quickstart","Title":"快速上手","Group":"开始使用","Text":"使用指南 OpsXShell 主打简单好用:常用远程操作走短路径,高级选项默认收起。不做堡垒审计。 安装(macOS) 从 打开 ,把 OpsXShell 拖到「应用程序」。Finder 里应是 Tauri 那套大图标布局(应用在左、Applications 在右)。 已经 staple 的正式包 一般可直接打开。 自己改代码后重新打包:先 (本机有签名配置就会签 Developer ID),再 (会要 App 专用密码)。新打的 DMG 在公证完成前仍会被 Gatekeeper 拦截。你现在要做的步骤见 。 快速连接 按 ,输入 或 后连接。默认端口为 。快速连接适合临时使用,不会自动保存会话。 需要长期使用时新建保存会话,选择密码或私钥认证,并按需设置分组、标签和启动命令。未填写密码或私钥的导入会话会尝试本机 SSH Agent 和常见默认密钥。 侧边栏分组内可上下拖拽主机调整顺序。拖到另一分组的标题上会放到该组末尾;分组展开后也可以直接拖到组内某一主机的上方或下方插入。在分组标题右键可选择「按名称排序」一次性重排。顺序会保存,新建的主机排在组末尾;搜索过滤和批量多选模式下暂不可拖拽。 安装版支持系统链接,例如: 点击后会唤起 OpsXShell,并打开已填好目标的快速连接窗口。为了避免网页静默连接陌生服务器,仍需用户确认连接;链接中禁止携带密码、远程路径、查询参数或片段。 代理与跳板 会话的高级选项支持: HTTP CONNECT 代理 SOCKS5 代理 可选代理用户名和密码 选择一个已保存会话作为跳板机 代理和跳板互斥,选择其中一个会清除另一个,避免连接路径含糊。界面保持单跳操作;Rust 连接层可处理已有配置中的最多 8 跳链。 端口转发与 SOCKS5 SSH 连接后,可在状态栏点击「转发」打开右侧抽屉,管理本地转发、远程转发和动态 SOCKS5。动态转发使本机成为 SOCKS5 代理,流量经当前 SSH 服务器出口 IP 访问外网。默认地址: 动态转发每台 SSH 主机仅一条,端口固定 ;在抽屉中直接启停。 状态栏「转发」右键可复制 。需要远程 DNS 解析的命令行工具应使用 ,例如 。 本地转发:本机监听默认只需填端口(绑定 / localhost,等同 );需要局域网访问时再展开高级项改为内网 IP 或 。目标主机相对当前 SSH 服务器(常用 或内网 IP),不是会话页主机名,且不能填 。 本地 / 远程规则在抽屉列表中添加、启停和删除;“停止”会关闭 Rust Listener,不是只改界面图标。 远程转发( ):远端监听填 (仅 SSH 服务器本机可访问)或 (远端内网其它主机也可访问,需 sshd 或 )。目标为本机或内网 (不能填 )。服务器还需 或 ;监听端口不能已被占用; 通常需要 root。可用 对照。 “复制规则”会创建独立的新规则,便于只修改端口或目标;不会复制原规则的运行状态。 运行中的规则选择“编辑”时,会先提示停止真实监听,再允许保存新配置。 保存的是规则,不是“运行中”状态;应用重启后需要用户再次启动。同一窗口内只要没点「停止」,SSH 断线、保活失败、空闲挂起或重连都会继续监听(本地 / SOCKS 端口不拆,远程转发会自动重听)。点停止、关闭标签、连接面板手动断开,或退出应用,才会关闭真实 Listener。关闭标签后再开同一会话不会自动拉起转发。 SOCKS5 默认仅监听本机,当前不提供局域网开放和客户端密码认证。 连接保活与重连 默认对齐常见 SSH / RDP 客户端,分三层,不要把「窗口还开着」理解成无视服务器超时: 链路心跳 :空闲时发 SSH 协议 keep alive(不写入 Shell)。挡的是 NAT/防火墙丢掉空闲 TCP,挡不住 Bash 或 Windows 空闲 GPO。 意外断线 :终端、SFTP 或远程桌面标签还开着时,有限次自动重连。SSH 重连后是新 Shell(长任务请在服务器上用 / );SFTP 会回到断线前的远程目录;RDP/VNC 重连是新会话,不会发假鼠标。 会话策略 :远端 / 只关掉那一格 Shell,点「重新打开 Shell」即可。关标签、空闲挂起不会硬续连接。 设置里的「保持心跳」和「自动重连」对应前两层;第三层尊重服务器,客户端不伪造按键。 远程桌面(RDP / VNC) 欢迎页或会话入口可打开 RDP / VNC 连接对话框(仅原生桌面应用): RDP:填写主机、端口、用户名、密码与可选域名;原生 IronRDP 引擎,支持剪贴板同步与共享盘(本机下载目录对应远端共享盘)。画面铺满当前窗口(任务栏贴底),连接时按窗口客户区请求分辨率;窗口缩放后再走 Display Control。 VNC:填写主机、端口与可选密码;原生 RFB 引擎,剪贴板按 UTF 8 发送。 连接后在独立标签中显示画面;工具栏可粘贴本机剪贴板、放入共享盘文件(RDP)或重新连接。标签还开着时网络闪断会有限次自动重连(新会话,不对抗服务器空闲注销)。 桌面会话不参与批量命令与终端广播。 导入 OpenSSH 配置 从应用菜单选择“文件 导入会话”,打开 。当前解析以下常用字段: 单个 别名 包含 、 或 的 Host 模式不会生成会话。导入后请检查目标、用户名、密钥路径和跳板关系再连接。 会话导出默认保存为 (密码加密的主机清单,格式类似 KeePass 、MobaXterm )。旧版 与 OpenSSH 仍可导入。导出包含主机分组、密钥和密码,务必保管备份密码。 SFTP SFTP 使用双栏文件管理器。中间箭头可上传/下载;上传和下载先写入 临时文件,中断后再次传输同一路径会从已有字节继续。传输完成并通过大小校验后才替\ufffd"},{"Slug":"ai","Title":"终端 AI","Group":"进阶","Text":"SSH Agent CLI 设计与演进 更新:2026 07 30 定位:OpsXShell 内置的轻量 SSH 运维 Agent,不是 AIOps 平台、堡垒机或 Kubernetes 控制面。 结论 OpsXShell 适合吸收 aiops Agent CLI 的执行 Harness,不适合照搬它的 WebSocket、服务器资产库、审计、审批、Kubernetes 专用工具和默认持久化记忆。 产品目标是:用户在已连接的 SSH 终端中输入自然语言任务,Agent 通过少量、边界清晰的工具获取真实证据,按用户选择的安全模式决定确认阈值,失败后根据输出换方法,最后给出有证据的结论。无论选择哪种模式,目标主机始终可见,critical 命令始终硬拒绝。 设计边界声明:OpsXShell Agent 只服务桌面端当前 SSH 会话。任务开始时锁定当前 connectionId,后续执行和取消始终作用于该连接;标签切换不得让任务迁移到另一台主机。Agent 专用 SSH 结果在 Rust 原生层脱敏后才返回界面和模型上下文。OpsXShell 不复用 OpsXCLI 的本机执行器,也不承担 AIOps 的资产授权、审批和永久审计职责。 参考来源 本设计已逐篇评估同级 及它们引用的工程基线: :推理、行动和观察交替。 :仅在有明确反馈回路和人工监督时使用 Agent。 :自主管理 Prompt、上下文、工具、暂停和确认。 :面向模型设计稳定的 Agent Computer Interface,不直接暴露人类 UI。 :重点防范 Prompt Injection、敏感信息泄露、不安全工具和过度自主权。 当前已落地基线 交互 终端工具栏只保留一个 入口。 面板只有主机、LLM、任务输入和一个“执行”按钮;回车发送, 换行。 不再让用户先判断“解释 / 生成命令 / 排障 / 执行任务”。Agent 根据任务和真实观察自行决定是继续取证还是收敛。 只自动附带用户当前明确选中的终端内容,不默认抓取整屏。 ReAct Harness 单次任务最多 12 步。aiops 默认 16 轮适合后端异步任务;OpsXShell 是前台桌面工具,12 步兼顾排查+修复与注意力、时延、成本。 相同命令最多出现 2 次,第 3 次在执行前停止。 第 6 轮检查是否已有足够证据,第 12 轮强制优先收敛;连续失败时 Prompt 要求更换排查路径。 单步输出进入 Agent 前有 12,000 字符上限,任务观察上下文有 48,000 字符上限。 是本地确定性工具:统计行数、提取错误关键行、保留首尾,不为压缩输出额外调用模型。 安全边界 等级 示例 严格模式 宽松模式(默认) safe 、 自动执行 自动执行 low 未知自定义查询命令 自动执行 自动执行 medium 文件写入、普通权限变更 先确认 自动执行 high 服务重启、删除、包安装、K8s 变更 先确认 先确认 critical 格式化磁盘、删除根目录、fork bomb 硬拒绝 硬拒绝 安全模式在任务开始时锁定,运行中不能切换;需要确认时,对话框必须显示本次锁定模式、目标、风险和完整单行命令。critical 在前端与 Rust 都会硬拒绝。旧文档里的「均衡 / 宽松第三级」已合并为宽松。 终端输出被标记为不可信数据,不得将日志中的“忽略规则”等文字当作指令。常见密码、Token、Authorization Header、AWS Key 和私钥块在 Rust 发送 Provider 前脱敏。 数据与记忆 当前不持久化任务、AI 回答、命令或工具输出。关闭面板即丢弃运行上下文。这与 OpsXShell “快捷客户端,不做审计和堡垒机”的边界一致。 aiops 能力取舍 aiops 能力 OpsXShell 结论 原因 / 适配方式 OpenAI / Anthropic LLM 适配 已吸收 保留 OpenAI Chat、Responses、Anthropic Compatible 及自定义 Provider 已吸收 固定使用当前活跃 ,不重新管理一套凭据 已适配 本地确定性摘要,降低 token 和幻觉 ReAct 16 轮 适配为 12 步 GUI 前台执行;12 步够排查+验证,仍低于后台异步 16 轮 失败反馈和循环检测 已吸收 退出码和真实输出回传,连续失败换路,相同命令限次 五级风险 已吸收 critical 硬拒绝,其他等级按安全模式阈值确认 两级安全模式 已适配 严格从 medium、宽松从 high 确认;critical 前后端均硬拒绝 WebSocket 事件流 不照搬 本地 React/Tauri 没有跨程服务器会话,使用内存状态即可 审计、审批、RBAC 不引入 属于 aiops/堡垒机,不是本地 SSH 客户端职责 podexec/K8s 专用工具 不引入 可沿远程 SSH 工具使用,不引入第二套目标和凭据边界 CMDB/告警/指标工具 不内置 这是 aiops 平台上下文;未来可通过用户显式配置的 MCP/网关扩展,不绑入 SSH 核心 自进化与四层记忆评估 aiops Evolver 的 Experience、Fact、Procedure、Skill 对平台很有价值,但直接搬到本地 SSH 客户端会与“不保存命令和工具输出”冲突,也容易把 IP、用户名、Token、日志和错误数据长期沉淀。 建议分四层,但只启用第一层: 层 内容 默认策略 L0 运行观察 当前任务的命令、退出码和截断输出 已实现,只在面板内存,关闭即清空 L1 主机事实 OS、包管理器、服务名等稳定事实 默认禁用;未来需逐主机开关、过期时间和可视化删除 L2 程序经验 脱敏后的通用排障步骤,不带主机和输出原文 默认禁用;只能由用户预览、编辑后显式保存 L3 Runbook/Skill 可重复使用的任务模板和参数 作为未来显式功能,类似脚本库,不由 Agent 静默写入 在没有完成“可查看、可编辑、可删除、可禁用、来源可解释、脱敏可验收”前,不得启用自动长期记忆。 演进架构 当前轻量循环在 React 面板内组装,下一阶段应将其抽成不依赖 UI 的 Agent Runtime: 长期应优先使用 Provider 的原生 tool calling / tool use,而不是依赖 bash 代码块。在 OpenAI Chat、Responses 和 Ant"}] \ No newline at end of file +[{"Slug":"overview","Title":"概述","Group":"开始使用","Text":"OpsXShell 是什么 OpsXShell 是基于 Tauri 2 与 Rust 的 原生桌面 运维终端:SSH 多标签分屏、SFTP、端口转发、RDP/VNC、串口与可选终端 AI。 操作入口 :桌面客户端( ) 本站 :产品官网与文档( → Gin) 不做 :堡垒机、审计审批、浏览器里的终端工作台 下载与校验和见 。"},{"Slug":"quickstart","Title":"快速上手","Group":"开始使用","Text":"使用指南 OpsXShell 主打简单好用:常用远程操作走短路径,高级选项默认收起。不做堡垒审计。 安装(macOS) 从官网下载,或打开本机构建产物 里的 ,把 OpsXShell 拖到「应用程序」。Finder 里应是 Tauri 那套大图标布局(应用在左、Applications 在右)。 已经 staple 的正式包 一般可直接打开。 自己改代码后重新打包:先 (本机有签名配置就会签 Developer ID),再 (会要 App 专用密码)。新打的 DMG 在公证完成前仍会被 Gatekeeper 拦截。你现在要做的步骤见 。 快速连接 按 ,输入 或 后连接。默认端口为 。快速连接适合临时使用,不会自动保存会话。 需要长期使用时新建保存会话,选择密码或私钥认证,并按需设置分组、标签和启动命令。未填写密码或私钥的导入会话会尝试本机 SSH Agent 和常见默认密钥。 侧边栏分组内可上下拖拽主机调整顺序。拖到另一分组的标题上会放到该组末尾;分组展开后也可以直接拖到组内某一主机的上方或下方插入。在分组标题右键可选择「按名称排序」一次性重排。顺序会保存,新建的主机排在组末尾;搜索过滤和批量多选模式下暂不可拖拽。 安装版支持系统链接,例如: 点击后会唤起 OpsXShell,并打开已填好目标的快速连接窗口。为了避免网页静默连接陌生服务器,仍需用户确认连接;链接中禁止携带密码、远程路径、查询参数或片段。 代理与跳板 会话的高级选项支持: HTTP CONNECT 代理 SOCKS5 代理 可选代理用户名和密码 选择一个已保存会话作为跳板机 代理和跳板互斥,选择其中一个会清除另一个,避免连接路径含糊。界面保持单跳操作;Rust 连接层可处理已有配置中的最多 8 跳链。 端口转发与 SOCKS5 SSH 连接后,可在状态栏点击「转发」打开右侧抽屉,管理本地转发、远程转发和动态 SOCKS5。动态转发使本机成为 SOCKS5 代理,流量经当前 SSH 服务器出口 IP 访问外网。默认地址: 动态转发每台 SSH 主机仅一条,端口固定 ;在抽屉中直接启停。 状态栏「转发」右键可复制 。需要远程 DNS 解析的命令行工具应使用 ,例如 。 本地转发:本机监听默认只需填端口(绑定 / localhost,等同 );需要局域网访问时再展开高级项改为内网 IP 或 。目标主机相对当前 SSH 服务器(常用 或内网 IP),不是会话页主机名,且不能填 。 本地 / 远程规则在抽屉列表中添加、启停和删除;“停止”会关闭 Rust Listener,不是只改界面图标。 远程转发( ):远端监听填 (仅 SSH 服务器本机可访问)或 (远端内网其它主机也可访问,需 sshd 或 )。目标为本机或内网 (不能填 )。服务器还需 或 ;监听端口不能已被占用; 通常需要 root。可用 对照。 “复制规则”会创建独立的新规则,便于只修改端口或目标;不会复制原规则的运行状态。 运行中的规则选择“编辑”时,会先提示停止真实监听,再允许保存新配置。 保存的是规则,不是“运行中”状态;应用重启后需要用户再次启动。同一窗口内只要没点「停止」,SSH 断线、保活失败、空闲挂起或重连都会继续监听(本地 / SOCKS 端口不拆,远程转发会自动重听)。点停止、关闭标签、连接面板手动断开,或退出应用,才会关闭真实 Listener。关闭标签后再开同一会话不会自动拉起转发。 SOCKS5 默认仅监听本机,当前不提供局域网开放和客户端密码认证。 连接保活与重连 默认对齐常见 SSH / RDP 客户端,分三层,不要把「窗口还开着」理解成无视服务器超时: 链路心跳 :空闲时发 SSH 协议 keep alive(不写入 Shell)。挡的是 NAT/防火墙丢掉空闲 TCP,挡不住 Bash 或 Windows 空闲 GPO。 意外断线 :终端、SFTP 或远程桌面标签还开着时,有限次自动重连。SSH 重连后是新 Shell(长任务请在服务器上用 / );SFTP 会回到断线前的远程目录;RDP/VNC 重连是新会话,不会发假鼠标。 会话策略 :远端 / 只关掉那一格 Shell,点「重新打开 Shell」即可。关标签、空闲挂起不会硬续连接。 设置里的「保持心跳」和「自动重连」对应前两层;第三层尊重服务器,客户端不伪造按键。 远程桌面(RDP / VNC) 欢迎页或会话入口可打开 RDP / VNC 连接对话框(仅原生桌面应用): RDP:填写主机、端口、用户名、密码与可选域名;原生 IronRDP 引擎,支持剪贴板同步与共享盘(本机下载目录对应远端共享盘)。画面铺满当前窗口(任务栏贴底),连接时按窗口客户区请求分辨率;窗口缩放后再走 Display Control。 VNC:填写主机、端口与可选密码;原生 RFB 引擎,剪贴板按 UTF 8 发送。 连接后在独立标签中显示画面;工具栏可粘贴本机剪贴板、放入共享盘文件(RDP)或重新连接。标签还开着时网络闪断会有限次自动重连(新会话,不对抗服务器空闲注销)。 桌面会话不参与批量命令与终端广播。 导入 OpenSSH 配置 从应用菜单选择“文件 导入会话”,打开 。当前解析以下常用字段: 单个 别名 包含 、 或 的 Host 模式不会生成会话。导入后请检查目标、用户名、密钥路径和跳板关系再连接。 会话导出默认保存为 (密码加密的主机清单,格式类似 KeePass 、MobaXterm )。旧版 与 OpenSSH 仍可导入。导出包含主机分组、密钥和密码,务必保管备份密码。 SFTP SFTP 使用双栏文件管理器。中间箭头可上传/下载;上传和下载先写入 临时文件,中断后再次传输同一路径会从已有字节继续。\ufffd"},{"Slug":"ai","Title":"终端 AI","Group":"进阶","Text":"SSH Agent CLI 设计与演进 更新:2026 07 30 定位:OpsXShell 内置的轻量 SSH 运维 Agent,不是 AIOps 平台、堡垒机或 Kubernetes 控制面。 结论 OpsXShell 适合吸收 aiops Agent CLI 的执行 Harness,不适合照搬它的 WebSocket、服务器资产库、审计、审批、Kubernetes 专用工具和默认持久化记忆。 产品目标是:用户在已连接的 SSH 终端中输入自然语言任务,Agent 通过少量、边界清晰的工具获取真实证据,按用户选择的安全模式决定确认阈值,失败后根据输出换方法,最后给出有证据的结论。无论选择哪种模式,目标主机始终可见,critical 命令始终硬拒绝。 设计边界声明:OpsXShell Agent 只服务桌面端当前 SSH 会话。任务开始时锁定当前 connectionId,后续执行和取消始终作用于该连接;标签切换不得让任务迁移到另一台主机。Agent 专用 SSH 结果在 Rust 原生层脱敏后才返回界面和模型上下文。OpsXShell 不复用 OpsXCLI 的本机执行器,也不承担 AIOps 的资产授权、审批和永久审计职责。 参考来源 本设计已逐篇评估同级 及它们引用的工程基线: :推理、行动和观察交替。 :仅在有明确反馈回路和人工监督时使用 Agent。 :自主管理 Prompt、上下文、工具、暂停和确认。 :面向模型设计稳定的 Agent Computer Interface,不直接暴露人类 UI。 :重点防范 Prompt Injection、敏感信息泄露、不安全工具和过度自主权。 当前已落地基线 交互 终端工具栏只保留一个 入口。 面板只有主机、LLM、任务输入和一个“执行”按钮;回车发送, 换行。 不再让用户先判断“解释 / 生成命令 / 排障 / 执行任务”。Agent 根据任务和真实观察自行决定是继续取证还是收敛。 只自动附带用户当前明确选中的终端内容,不默认抓取整屏。 ReAct Harness 单次任务最多 12 步。aiops 默认 16 轮适合后端异步任务;OpsXShell 是前台桌面工具,12 步兼顾排查+修复与注意力、时延、成本。 相同命令最多出现 2 次,第 3 次在执行前停止。 第 6 轮检查是否已有足够证据,第 12 轮强制优先收敛;连续失败时 Prompt 要求更换排查路径。 单步输出进入 Agent 前有 12,000 字符上限,任务观察上下文有 48,000 字符上限。 是本地确定性工具:统计行数、提取错误关键行、保留首尾,不为压缩输出额外调用模型。 安全边界 等级 示例 严格模式 宽松模式(默认) safe 、 自动执行 自动执行 low 未知自定义查询命令 自动执行 自动执行 medium 文件写入、普通权限变更 先确认 自动执行 high 服务重启、删除、包安装、K8s 变更 先确认 先确认 critical 格式化磁盘、删除根目录、fork bomb 硬拒绝 硬拒绝 安全模式在任务开始时锁定,运行中不能切换;需要确认时,对话框必须显示本次锁定模式、目标、风险和完整单行命令。critical 在前端与 Rust 都会硬拒绝。旧文档里的「均衡 / 宽松第三级」已合并为宽松。 终端输出被标记为不可信数据,不得将日志中的“忽略规则”等文字当作指令。常见密码、Token、Authorization Header、AWS Key 和私钥块在 Rust 发送 Provider 前脱敏。 数据与记忆 当前不持久化任务、AI 回答、命令或工具输出。关闭面板即丢弃运行上下文。这与 OpsXShell “快捷客户端,不做审计和堡垒机”的边界一致。 aiops 能力取舍 aiops 能力 OpsXShell 结论 原因 / 适配方式 OpenAI / Anthropic LLM 适配 已吸收 保留 OpenAI Chat、Responses、Anthropic Compatible 及自定义 Provider 已吸收 固定使用当前活跃 ,不重新管理一套凭据 已适配 本地确定性摘要,降低 token 和幻觉 ReAct 16 轮 适配为 12 步 GUI 前台执行;12 步够排查+验证,仍低于后台异步 16 轮 失败反馈和循环检测 已吸收 退出码和真实输出回传,连续失败换路,相同命令限次 五级风险 已吸收 critical 硬拒绝,其他等级按安全模式阈值确认 两级安全模式 已适配 严格从 medium、宽松从 high 确认;critical 前后端均硬拒绝 WebSocket 事件流 不照搬 本地 React/Tauri 没有跨程服务器会话,使用内存状态即可 审计、审批、RBAC 不引入 属于 aiops/堡垒机,不是本地 SSH 客户端职责 podexec/K8s 专用工具 不引入 可沿远程 SSH 工具使用,不引入第二套目标和凭据边界 CMDB/告警/指标工具 不内置 这是 aiops 平台上下文;未来可通过用户显式配置的 MCP/网关扩展,不绑入 SSH 核心 自进化与四层记忆评估 aiops Evolver 的 Experience、Fact、Procedure、Skill 对平台很有价值,但直接搬到本地 SSH 客户端会与“不保存命令和工具输出”冲突,也容易把 IP、用户名、Token、日志和错误数据长期沉淀。 建议分四层,但只启用第一层: 层 内容 默认策略 L0 运行观察 当前任务的命令、退出码和截断输出 已实现,只在面板内存,关闭即清空 L1 主机事实 OS、包管理器、服务名等稳定事实 默认禁用;未来需逐主机开关、过期时间和可视化删除 L2 程序经验 脱敏后的通用排障步骤,不带主机和输出原文 默认禁用;只能由用户预览、编辑后显式保存 L3 Runbook/Skill 可重复使用的任务模板和参数 作为未来显式功能,类似脚本库,不由 Agent 静默写入 在没有完成“可查看、可编辑、可删除、可禁用、来源可解释、脱敏可验收”前,不得启用自动长期记忆。 演进架构 当前轻量循环在 React 面板内组装,下一阶段应将其抽成不依赖 UI 的 Agent Runtime: 长期应优先使用 Provider 的原生 tool calling / tool use,而不是依赖 bash 代码块。在 OpenAI Chat、Responses 和 Ant"}] \ No newline at end of file diff --git a/homepage/dist/index.html b/homepage/dist/index.html index 71106e9..eca82ab 100644 --- a/homepage/dist/index.html +++ b/homepage/dist/index.html @@ -22,6 +22,7 @@ 功能 终端 AI 价格 + 授权 安全 下载 文档 diff --git a/homepage/dist/license.html b/homepage/dist/license.html new file mode 100644 index 0000000..bf0de30 --- /dev/null +++ b/homepage/dist/license.html @@ -0,0 +1,204 @@ + + + + + +授权与激活 · OpsXShell + + + + + + + + +
+
+ 30 天免费试用 · 首次启动自动开始 · 无需注册 +

授权与激活

+

一次说清四件事:怎么买、授权码怎么交付、程序里怎么激活、换机与断网怎么办。授权绑定设备而非账号,全流程不需要注册。

+
+ +
+
+

交付与激活:四步

+

从下单到激活通常当天完成,最短几分钟。

+
+
+ STEP 1 +

下单确认

+

邮件说明产品、授权类型(包年 / 永久)与设备数量。支持对公转账与开具发票,工作日当天回复。

+
+
+ STEP 2 +

邮件交付授权码

+

付款确认后即刻签发,授权码以邮件送达你的邮箱:联网用 LIC- 前缀的在线授权码,隔离内网用 LICOFF- 前缀的离线许可证。

+
+
+ STEP 3 +

应用内激活

+

打开「设置 → 授权」,粘贴授权码点击激活。程序连接授权服务器 licence.rlwj.cn 登记本机设备并回写一次性激活令牌,此后每 7 天自动校验一次。

+
+
+ STEP 4 +

换机与续期

+

在本机自助解绑即可把席位迁到新机器,每年免费换绑 2 次;到期前 30 天邮件提醒,续期后签发新授权码替换即可。

+
+
+
+
+ +
+
+

两种激活方式

+

能联网就用在线授权码,完全不出网就用离线许可证——功能与有效期一致。

+
+ + + + + + + + + + + + +
对比项在线授权码 LIC-离线许可证 LICOFF-
是否联网激活时联网一次,之后每 7 天校验一次全程无需联网,本地验签
设备绑定绑定设备 ID,一机一码绑定设备 ID,一机一码
断网可用激活后可连续离线使用 30 天始终有效,与网络无关
有效期包年 365 天;永久授权长期有效单张最长 365 天,可续签
换绑应用内自助解绑,每年免费换绑 2 次邮件换取新证并解绑旧设备
适合场景办公网、云主机、个人电脑生产内网、专有云、隔离环境
+
+
+

授权服务器会收到什么?客户端只与 licence.rlwj.cn(443)通信,用于设备登记与周期校验,只发送授权码与设备标识(设备 ID、设备名称)——不发送主机地址、账号、命令与会话内容等任何业务数据。服务端返回 Ed25519 签名,客户端本地验签,验签失败按未授权处理。

+
    +
  • 内网只放行白名单出网:把 licence.rlwj.cn 加入白名单,或直接使用离线许可证。
  • +
  • 授权服务器不可达:按宽限期继续可用,业务不会当场中断;恢复网络后自动补校验。
  • +
  • 不想让客户端出网:一律选离线许可证,客户端永不发起网络请求。
  • +
+
+
+
+ +
+
+

授权类型与价格

+

免费层永久免费;专业功能按包年或一次性买断授权。

+
+ + + + + + + + + +
授权价格设备数包含
免费层¥0不涉及授权SSH 终端、SFTP、本地终端、会话管理与配置导入
专业版 · 包年¥99 / 年2 台端口转发、终端 AI、批量执行、RDP / VNC、串口、应用内升级
专业版 · 永久¥199 一次性5 台包年全部功能,一次买断、无续费,支持离线许可证
+
+

完整功能对比、让利与组合报价见 定价页。表中为标价,实际成交可按场景议价;教育与非营利用途可申请优惠。

+
+
+ +
+
+

授权常见问题

+
+
授权码多久能收到?

付款确认后即刻签发并邮件发出,工作日通常当天完成(含开票需求)。邮件里就是完整授权码,无需注册账号或登录任何后台。

+
授权绑定设备还是账号?

绑定设备。每台机器有唯一设备 ID,一个授权码按授权的设备数占座,与账号无关——换人使用不影响,重装系统前建议先解绑。

+
换电脑 / 重装系统后设备 ID 变了怎么办?

旧机还在:在「设置 → 授权」点解绑,腾出席位后在新机激活。旧机已不在手:邮件与我们说明(附授权码后四位与新设备 ID),由我们在授权后台释放旧设备。每年免费换绑 2 次。

+
断网了授权会失效吗?

不会。离线许可证本地自验,永不联网也有效;在线授权码激活后可连续离线使用 30 天,超时后联网校验一次即可继续。授权服务器不可达时按宽限期放行,不会中断正在做的工作。

+
生产内网完全不出网,怎么激活?

改用离线许可证(LICOFF-):在应用内导出本机机器码,邮件发我们换取离线证,本地导入即完成激活,全程不需要客户端联网。

+
续期怎么操作?

到期前 30 天我们会邮件提醒。付款后签发新的授权码,在「设置 → 授权」里替换旧码即可,同一台设备无需先解绑;永久授权无需续期。

+
试用期结束后我的配置和数据还在吗?

都在。授权只控制专业功能是否可用,本机会话、配置、日志等数据不做任何改动;试用结束后免费层继续可用,购买授权后专业功能立即恢复。

+
激活失败怎么排查?

先在「设置 → 授权」看当前状态与到期时间。若提示无效或不匹配,请把授权码后四位、设备 ID 与报错截图一并发邮件,我们核对授权服务器上的记录后处理(常见原因是设备数已占满或授权码输漏字符)。

+
能开发票、走对公转账吗?

可以。个人与企业均可开具发票,支持对公转账、多产品捆绑与批量授权;邮件说明抬头与税号即可。

+
三个产品(OpsXShell / OpsxDB / OpsxAPI)要分别买吗?

三个产品独立授权、独立计价;它们共用同一套授权体系(同一个设备 ID 规则与同一个授权服务器)。多产品组合、团队或教育用途可邮件说明需求,给捆绑价。

+
+

本页更新于 2026-10-16,授权口径与授权服务器 licence.rlwj.cn 实际配置一致。

+
+
+ +
+
+

准备好购买授权

+

邮件说明产品、授权类型与设备数,当天回复并开票。

+ +

付款后当场发放授权码(LIC-),粘贴到「设置 → 授权」即完成激活——整个流程无需注册账号。

+
+
+
+ + + + diff --git a/homepage/dist/license/index.html b/homepage/dist/license/index.html new file mode 100644 index 0000000..bf0de30 --- /dev/null +++ b/homepage/dist/license/index.html @@ -0,0 +1,204 @@ + + + + + +授权与激活 · OpsXShell + + + + + + + + +
+
+ 30 天免费试用 · 首次启动自动开始 · 无需注册 +

授权与激活

+

一次说清四件事:怎么买、授权码怎么交付、程序里怎么激活、换机与断网怎么办。授权绑定设备而非账号,全流程不需要注册。

+
+ +
+
+

交付与激活:四步

+

从下单到激活通常当天完成,最短几分钟。

+
+
+ STEP 1 +

下单确认

+

邮件说明产品、授权类型(包年 / 永久)与设备数量。支持对公转账与开具发票,工作日当天回复。

+
+
+ STEP 2 +

邮件交付授权码

+

付款确认后即刻签发,授权码以邮件送达你的邮箱:联网用 LIC- 前缀的在线授权码,隔离内网用 LICOFF- 前缀的离线许可证。

+
+
+ STEP 3 +

应用内激活

+

打开「设置 → 授权」,粘贴授权码点击激活。程序连接授权服务器 licence.rlwj.cn 登记本机设备并回写一次性激活令牌,此后每 7 天自动校验一次。

+
+
+ STEP 4 +

换机与续期

+

在本机自助解绑即可把席位迁到新机器,每年免费换绑 2 次;到期前 30 天邮件提醒,续期后签发新授权码替换即可。

+
+
+
+
+ +
+
+

两种激活方式

+

能联网就用在线授权码,完全不出网就用离线许可证——功能与有效期一致。

+
+ + + + + + + + + + + + +
对比项在线授权码 LIC-离线许可证 LICOFF-
是否联网激活时联网一次,之后每 7 天校验一次全程无需联网,本地验签
设备绑定绑定设备 ID,一机一码绑定设备 ID,一机一码
断网可用激活后可连续离线使用 30 天始终有效,与网络无关
有效期包年 365 天;永久授权长期有效单张最长 365 天,可续签
换绑应用内自助解绑,每年免费换绑 2 次邮件换取新证并解绑旧设备
适合场景办公网、云主机、个人电脑生产内网、专有云、隔离环境
+
+
+

授权服务器会收到什么?客户端只与 licence.rlwj.cn(443)通信,用于设备登记与周期校验,只发送授权码与设备标识(设备 ID、设备名称)——不发送主机地址、账号、命令与会话内容等任何业务数据。服务端返回 Ed25519 签名,客户端本地验签,验签失败按未授权处理。

+
    +
  • 内网只放行白名单出网:把 licence.rlwj.cn 加入白名单,或直接使用离线许可证。
  • +
  • 授权服务器不可达:按宽限期继续可用,业务不会当场中断;恢复网络后自动补校验。
  • +
  • 不想让客户端出网:一律选离线许可证,客户端永不发起网络请求。
  • +
+
+
+
+ +
+
+

授权类型与价格

+

免费层永久免费;专业功能按包年或一次性买断授权。

+
+ + + + + + + + + +
授权价格设备数包含
免费层¥0不涉及授权SSH 终端、SFTP、本地终端、会话管理与配置导入
专业版 · 包年¥99 / 年2 台端口转发、终端 AI、批量执行、RDP / VNC、串口、应用内升级
专业版 · 永久¥199 一次性5 台包年全部功能,一次买断、无续费,支持离线许可证
+
+

完整功能对比、让利与组合报价见 定价页。表中为标价,实际成交可按场景议价;教育与非营利用途可申请优惠。

+
+
+ +
+
+

授权常见问题

+
+
授权码多久能收到?

付款确认后即刻签发并邮件发出,工作日通常当天完成(含开票需求)。邮件里就是完整授权码,无需注册账号或登录任何后台。

+
授权绑定设备还是账号?

绑定设备。每台机器有唯一设备 ID,一个授权码按授权的设备数占座,与账号无关——换人使用不影响,重装系统前建议先解绑。

+
换电脑 / 重装系统后设备 ID 变了怎么办?

旧机还在:在「设置 → 授权」点解绑,腾出席位后在新机激活。旧机已不在手:邮件与我们说明(附授权码后四位与新设备 ID),由我们在授权后台释放旧设备。每年免费换绑 2 次。

+
断网了授权会失效吗?

不会。离线许可证本地自验,永不联网也有效;在线授权码激活后可连续离线使用 30 天,超时后联网校验一次即可继续。授权服务器不可达时按宽限期放行,不会中断正在做的工作。

+
生产内网完全不出网,怎么激活?

改用离线许可证(LICOFF-):在应用内导出本机机器码,邮件发我们换取离线证,本地导入即完成激活,全程不需要客户端联网。

+
续期怎么操作?

到期前 30 天我们会邮件提醒。付款后签发新的授权码,在「设置 → 授权」里替换旧码即可,同一台设备无需先解绑;永久授权无需续期。

+
试用期结束后我的配置和数据还在吗?

都在。授权只控制专业功能是否可用,本机会话、配置、日志等数据不做任何改动;试用结束后免费层继续可用,购买授权后专业功能立即恢复。

+
激活失败怎么排查?

先在「设置 → 授权」看当前状态与到期时间。若提示无效或不匹配,请把授权码后四位、设备 ID 与报错截图一并发邮件,我们核对授权服务器上的记录后处理(常见原因是设备数已占满或授权码输漏字符)。

+
能开发票、走对公转账吗?

可以。个人与企业均可开具发票,支持对公转账、多产品捆绑与批量授权;邮件说明抬头与税号即可。

+
三个产品(OpsXShell / OpsxDB / OpsxAPI)要分别买吗?

三个产品独立授权、独立计价;它们共用同一套授权体系(同一个设备 ID 规则与同一个授权服务器)。多产品组合、团队或教育用途可邮件说明需求,给捆绑价。

+
+

本页更新于 2026-10-16,授权口径与授权服务器 licence.rlwj.cn 实际配置一致。

+
+
+ +
+
+

准备好购买授权

+

邮件说明产品、授权类型与设备数,当天回复并开票。

+ +

付款后当场发放授权码(LIC-),粘贴到「设置 → 授权」即完成激活——整个流程无需注册账号。

+
+
+
+ + + + diff --git a/homepage/dist/pricing.html b/homepage/dist/pricing.html index ecd4327..1d506fc 100644 --- a/homepage/dist/pricing.html +++ b/homepage/dist/pricing.html @@ -28,20 +28,21 @@ @@ -148,13 +149,14 @@

轻量运维终端 · 便捷、人性化、操作简单实用

diff --git a/homepage/dist/pricing/index.html b/homepage/dist/pricing/index.html new file mode 100644 index 0000000..1d506fc --- /dev/null +++ b/homepage/dist/pricing/index.html @@ -0,0 +1,167 @@ + + + + + +授权与定价 · OpsXShell + + + + + + + +
+
+ 🚀 30 天免费试用 · 首次启动自动开始 · 无需注册 +

授权与定价

+

OpsXShell 免费层长期可用;专业功能(转发 / AI / 远程桌面 / 串口)需要授权。许可证绑定设备而非订阅账号,离线许可证支持完全离线激活。

+
+ +
+
+

先试用,再决定

+

下载即含 30 天专业版试用;激活支持在线与离线两种方式。

+
+

🚀 30 天全功能试用

首次启动自动开始;无需注册、无需信用卡。试用期覆盖专业版全部功能。

+

🌐 在线授权 LIC-

联网激活并绑定设备;支持自助解绑换机;激活后可连续离线使用 30 天。

+

🛡️ 离线许可证 LICOFF-

Ed25519 自包含签名,绑定设备;完全无网络也能激活,适合隔离内网环境。

+
+
+
+ +
+
+

选择适合的授权

+

免费层永久免费;专业版可选包年或一次性买断。

+
+
+
免费
+
¥0
+
日常 SSH 运维完全够用
+
    +
  • SSH 终端(密码 / 私钥 / Agent)
  • +
  • SFTP 双栏文件管理
  • +
  • 本地终端(zsh / bash / sh)
  • +
  • 会话管理与 ~/.ssh/config 导入
  • +
  • 7 语种界面
  • +
+ 免费下载 +
+ +
+
专业版 · 永久
+
¥199一次性
+
5 台设备 · 终身授权
+
    +
  • 包含包年全部功能
  • +
  • 一次买断,无续费
  • +
  • 离线许可证(LICOFF-)支持
  • +
  • 后续版本持续可用
  • +
  • 应用内升级
  • +
+ 购买咨询 +
+
+

支付后当场发放授权码(LIC-),粘贴到「设置 → 授权」即完成激活——整个流程无需注册账号;许可证一机一码绑定设备,每年可免费换绑 2 次。
购买咨询邮件请注明「OpsXShell」——Opsx 系列同一位开发者,多产品捆绑可议价。

+
+
+ +
+
+

常见问题

+
+
试用是怎么计算的?

30 天全功能试用,从应用首次启动那一刻自动开始——无需注册账号,无需信用卡。试用期覆盖专业版全部功能;结束后免费层继续可用。

+
在线授权和离线激活有什么区别?

在线授权码(LIC- 前缀):联网激活,绑定设备,支持在设置中自助解绑换机;激活后可连续离线使用最长 30 天。离线许可证(LICOFF- 前缀):同样绑定设备,但采用 Ed25519 自包含签名,在完全无网络的环境也能激活——适合隔离内网。两种方式在「设置 → 授权」中粘贴即用。

+
一个授权能用几台设备?

授权绑定设备而非订阅账号。专业版包年 2 台、永久 5 台;设备可以在「设置 → 授权」中解绑后迁移到新机器。

+
断网了授权会失效吗?

离线许可证(LICOFF-)本地自验,永不联网也有效。在线授权(LIC-)容忍连续 30 天离线,超过后需联网重新验证一次。

+
退款政策是怎样的?

自付款之日起 30 天内无理由全额退款——先用起来,不满意直接退。

+
怎么购买?

邮件咨询购买(请注明 OpsXShell),当天回复;支持对公转账与开票。

+
三个产品(OpsxAPI / OpsxDB / OpsXShell)要分别买吗?

三个产品独立授权、独立计价。多产品组合或学生优惠可直接邮件说明需求,给捆绑价。

+
授权包含哪些升级?

年付授权含 1 年免费升级;永久授权包含后续版本更新。

+
+
+
+ +
+
+

独立开发,认真长跑。
Opsx 系列工具由独立开发者打造,每一份授权的收入都直接投入产品迭代——没有投资人,也没有广告。

+

还没装?立即下载

+
+
+
+ + + \ No newline at end of file diff --git a/homepage/dist/site/assets/style.css b/homepage/dist/site/assets/style.css index 3139a0b..7d8f6a6 100644 --- a/homepage/dist/site/assets/style.css +++ b/homepage/dist/site/assets/style.css @@ -755,6 +755,129 @@ footer a:hover { color: var(--accent); } +/* ── 定价 / 授权页共享基础类 ─────────────────────── */ +/* Opsx 系列三站的 pricing.html / license.html 使用同一套标记(wrap / section / + sec-title / price-card / plan-tag / deal-note)。opsxdb、opsxapi 的 site.css + 原生带这些规则;本站 style.css 缺这一段,导致 /pricing 页内容贴左、价格卡 + 无卡片样式(2026-10-16 补齐,仅新增、不改动既有规则)。 // Logan.Li */ +.wrap { + max-width: 1080px; + margin: 0 auto; + padding: 0 24px; +} +.section { + padding: 74px 0; +} +.section.alt { + background: var(--bg-soft); + border-top: 1px solid var(--border); + border-bottom: 1px solid var(--border); +} +.sec-title { + font-size: 28px; + font-weight: 800; + text-align: center; + margin: 0 0 8px; +} +.sec-sub { + text-align: center; + color: var(--text-2); + font-size: 14.5px; + margin: 0 0 34px; +} +/* 价格卡(暗色主题版:--panel + --border,与本站整体一致) */ +.pricing.three { + max-width: 1080px; + margin: 0 auto; +} +.price-card { + position: relative; + background: var(--panel); + border: 1px solid var(--border); + border-radius: 16px; + padding: 28px 26px 24px; + display: flex; + flex-direction: column; +} +.price-card.featured { + border-color: rgba(85, 174, 242, 0.55); + background: linear-gradient(180deg, rgba(85, 174, 242, 0.08), var(--panel) 45%); +} +.price-card .plan { + background: none; + border: 0; + border-radius: 0; + padding: 0; + font-size: 15px; + font-weight: 700; + color: var(--text-2); +} +.price-card .plan-sub { + font-size: 12.5px; + color: var(--text-3); + margin: 2px 0 16px; +} +.price-card .price, +.price-card .price b { + font-size: 32px; + font-weight: 800; +} +.price-card .price { + margin: 8px 0 0; +} +.price-card .price span { + font-size: 13.5px; + font-weight: 400; + color: var(--text-3); + margin-left: 4px; +} +.price-card ul { + list-style: none; + display: grid; + gap: 8px; + margin: 6px 0 22px; + padding: 0; + flex: 1; +} +.price-card ul li { + font-size: 13.6px; + color: var(--text-2); + display: flex; + gap: 9px; +} +.price-card ul li::before { + content: '✓'; + color: var(--green); + font-weight: 700; + flex-shrink: 0; +} +.price-card .btn { + width: 100%; +} +.plan-tag { + position: absolute; + top: -12px; + left: 50%; + transform: translateX(-50%); + background: var(--accent); + color: #06121c; + font-size: 11.5px; + font-weight: 700; + padding: 3px 12px; + border-radius: 999px; + white-space: nowrap; +} +.deal-note { + font-size: 13px; + line-height: 1.9; + color: var(--text-3); + margin-top: 18px; +} +.footnote { + font-size: 13px; + color: var(--text-3); +} + /* ── Responsive ──────────────────────────────────── */ @media (max-width: 960px) { .hero-grid { diff --git a/homepage/index.html b/homepage/index.html index adfaf78..eca82ab 100644 --- a/homepage/index.html +++ b/homepage/index.html @@ -21,7 +21,8 @@