From 1d3c0d11ca4d83941744e203dea53cf5e95413dc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=A9=BA=E6=BE=88?=
Date: Fri, 14 Aug 2026 09:13:34 +0800
Subject: [PATCH 1/2] feat(site): showcase ANOLISA capabilities
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- add component-specific scenes for runtime and security
- show Cosh copilot modes and SkillFS read-time OS adaptation
- align responsive motion and claims with documented behavior
Signed-off-by: 空澈
---
README.md | 106 +-
README_zh.md | 104 +-
website/src/css/custom.css | 3636 +++++++++++++++++++++++++++++++++++
website/src/pages/index.tsx | 1326 ++++++++++++-
4 files changed, 5018 insertions(+), 154 deletions(-)
diff --git a/README.md b/README.md
index 56545d35c1..a146251dcc 100644
--- a/README.md
+++ b/README.md
@@ -25,12 +25,12 @@ responses that reach the model before they cost you — while keeping the Shell,
Agent framework, and sandbox you already run.
[中文版](README_zh.md) · [Website](https://agentic-os.sh/) ·
-[Quick Start](docs/QUICKSTART.md) ·
-[User Guide](docs/user-guide/en/README.md) ·
-[Contributing](CONTRIBUTING.md)
+[Quick Start](https://agentic-os.sh/docs/quickstart/) ·
+[User Guide](https://agentic-os.sh/docs/user-guide/) ·
+[Contributing](https://github.com/alibaba/anolisa/blob/main/CONTRIBUTING.md)
-[](LICENSE)
-[](docs/user-guide/en/installation.md)
+[](https://github.com/alibaba/anolisa/blob/main/LICENSE)
+[](https://agentic-os.sh/docs/user-guide/installation/)
@@ -42,12 +42,42 @@ execution environments. Keep the Shell, Agent framework, and sandbox you
already use. ANOLISA CLI provides a single installation entry point, while each
capability can be enabled independently.
-
-
-
+**New to ANOLISA?**
+[Choose your first outcome in the Quick Start →](https://agentic-os.sh/docs/quickstart/)
+
+## Components
+
+
## What it solves
@@ -60,17 +90,20 @@ then adds an Agent that can understand intent, use tools and Skills, and ask
for approval before risky work. Shell commands and natural language share one
terminal instead of forcing users into a separate chat application.
-[Get started with cosh-ng →](docs/user-guide/en/user-entrypoint/cosh-ng/QUICKSTART.md)
+[Get started with cosh-ng →](https://agentic-os.sh/docs/user-guide/user-entrypoint/cosh-ng/quickstart/)
02 · CONTEXT EFFICIENCY
See where Tokens go and cut waste before it reaches the model
Token-less removes redundancy from tool schemas and responses.
-[Agent Memory](src/agent-memory/README.md) reuses context across sessions,
-[SkillFS](src/skillfs/README.md) exposes Skills as views and mounts them on
+[Agent Memory](https://agentic-os.sh/docs/user-guide/token-saving/agent-memory/)
+reuses context across sessions,
+[SkillFS](https://agentic-os.sh/docs/user-guide/runtime/skillfs/) exposes Skills
+as views and mounts them on
demand so only the relevant ones enter the context, and
-[AgentSight](src/agentsight/README.md) records where Tokens are actually spent.
+[AgentSight](https://agentic-os.sh/docs/user-guide/agent-observability/agentsight/)
+records where Tokens are actually spent.
### Try Token-less with Claude Code in 3 minutes
@@ -113,13 +146,6 @@ tokenless stats list --limit 5
-
-
-
-
`debug` and `trace` are dropped by the field blacklist, `metadata` as null, and
`tags` / `extra` as empty values. Compression runs between the Agent and the
model, so no Agent framework code changes. Dropped array items stay retrievable
@@ -131,18 +157,21 @@ through a `<>` marker, which keeps the compression reversible.
| ResponseCompressor · 46.85 µs | SchemaCompressor · 11.44 µs | 198.91 µs |
Savings apply to the tool responses entering the context, not to the whole
-session bill — the [Token-less README](src/tokenless/README.md) explains how to
-estimate the effect for a given workload.
+session bill. The [Token-less user manual](https://agentic-os.sh/docs/user-guide/token-saving/tokenless/user-manual/)
+explains how to estimate the effect for a given workload.
03 · EXECUTION RUNTIME
Give every Agent execution a boundary and a way back
ANOLISA is building out the Agent execution environment:
-[Agent Sec Core](src/agent-sec-core/README.md) isolates risky operations, and
-[ws-ckpt](src/ws-ckpt/README.md) keeps recovery points for workspace changes.
+[Agent Sec Core](https://agentic-os.sh/docs/user-guide/agent-security/agent-sec-core/quickstart/)
+isolates risky operations, and
+[ws-ckpt](https://agentic-os.sh/docs/user-guide/runtime/ws-ckpt/) keeps recovery
+points for workspace changes.
-[Start with ANOLISA CLI →](docs/user-guide/en/user-entrypoint/anolisa-cli.md)
+[Choose a runtime or security starting point →](https://agentic-os.sh/docs/quickstart/)
+· [Start with ANOLISA CLI](https://agentic-os.sh/docs/user-guide/user-entrypoint/anolisa-cli/)
## Install
@@ -159,16 +188,16 @@ anolisa install tokenless
Run `cosh` to enter the AI-native terminal. Token-less can also optimize tool
calls from an existing Agent without changing its framework.
-[Read the Quick Start →](docs/QUICKSTART.md)
+[Read the Quick Start →](https://agentic-os.sh/docs/quickstart/)
## Documentation
-[Quick Start](docs/QUICKSTART.md) ·
-[Installation](docs/user-guide/en/installation.md) ·
-[User Guide](docs/user-guide/en/README.md) ·
-[Troubleshooting](docs/user-guide/en/troubleshooting.md) ·
-[Build from Source](docs/BUILDING.md) ·
-[Changelog](CHANGELOG.md)
+[Quick Start](https://agentic-os.sh/docs/quickstart/) ·
+[Installation](https://agentic-os.sh/docs/user-guide/installation/) ·
+[User Guide](https://agentic-os.sh/docs/user-guide/) ·
+[Troubleshooting](https://agentic-os.sh/docs/user-guide/troubleshooting/) ·
+[Build from Source](https://agentic-os.sh/docs/building/) ·
+[Changelog](https://agentic-os.sh/changelog/)
## Community
@@ -182,9 +211,12 @@ Scan with DingTalk to join the ANOLISA community.
- [Open an issue](https://github.com/alibaba/anolisa/issues) for bugs and
feature requests.
-- Read [CONTRIBUTING.md](CONTRIBUTING.md) before submitting a pull request.
-- Report vulnerabilities through the [Security Policy](SECURITY.md).
+- Read [CONTRIBUTING.md](https://github.com/alibaba/anolisa/blob/main/CONTRIBUTING.md)
+ before submitting a pull request.
+- Report vulnerabilities through the
+ [Security Policy](https://github.com/alibaba/anolisa/blob/main/SECURITY.md).
## License
-ANOLISA is released under the [Apache License 2.0](LICENSE).
+ANOLISA is released under the
+[Apache License 2.0](https://github.com/alibaba/anolisa/blob/main/LICENSE).
diff --git a/README_zh.md b/README_zh.md
index f62e7c87bc..93829272b5 100644
--- a/README_zh.md
+++ b/README_zh.md
@@ -23,13 +23,13 @@
让 Agent 在你的终端里直接指挥系统干活,并在工具响应进入模型之前去掉冗余,
同时保留你现有的 Shell、Agent 框架和沙箱。
-[English](README.md) · [项目网站](https://agentic-os.sh/) ·
-[快速开始](docs/QUICKSTART_zh.md) ·
-[用户指南](docs/user-guide/zh/README.md) ·
-[参与贡献](CONTRIBUTING_zh.md)
+[English](README.md) · [项目网站](https://agentic-os.sh/zh/) ·
+[快速开始](https://agentic-os.sh/zh/docs/quickstart/) ·
+[用户指南](https://agentic-os.sh/zh/docs/user-guide/) ·
+[参与贡献](https://github.com/alibaba/anolisa/blob/main/CONTRIBUTING_zh.md)
-[](LICENSE)
-[](docs/user-guide/zh/installation.md)
+[](https://github.com/alibaba/anolisa/blob/main/LICENSE)
+[](https://agentic-os.sh/zh/docs/user-guide/installation/)
@@ -39,12 +39,42 @@ ANOLISA 是面向 AI Agent 工作负载的服务端操作系统层。它从终
开销和执行环境三个方向解决 Agent 运行中的关键问题,同时保留现有的 Shell、
Agent 框架和沙箱。ANOLISA CLI 提供统一的安装入口,各项能力可以按需启用。
-
-
-
+**第一次使用 ANOLISA?**
+[从快速入门选择你的第一个目标 →](https://agentic-os.sh/zh/docs/quickstart/)
+
+## 组件
+
+
## 解决什么问题
@@ -56,15 +86,17 @@ cosh-ng 是面向 AI 时代重构的 Linux 终端。它保留熟悉的 Bash/Zsh
能理解意图、调用工具与 Skills、并在高风险操作前请求确认的 Agent。Shell 命令和
自然语言共用一个终端,不必切换到独立的聊天应用。
-[开始使用 cosh-ng →](docs/user-guide/zh/user-entrypoint/cosh-ng/QUICKSTART.md)
+[开始使用 cosh-ng →](https://agentic-os.sh/zh/docs/user-guide/user-entrypoint/cosh-ng/quickstart/)
02 · CONTEXT EFFICIENCY
看清 Token 去向,在内容进入模型前减少无效消耗
-Token-less 去掉工具 Schema 和响应中的冗余,[Agent Memory](src/agent-memory/README_zh.md)
-复用跨会话信息,[SkillFS](src/skillfs/README_zh.md) 按视图暴露、按需挂载
-Skills,只把用得到的技能放进上下文,[AgentSight](src/agentsight/README_zh.md)
+Token-less 去掉工具 Schema 和响应中的冗余,
+[Agent Memory](https://agentic-os.sh/zh/docs/user-guide/token-saving/agent-memory/)
+复用跨会话信息,[SkillFS](https://agentic-os.sh/zh/docs/user-guide/runtime/skillfs/)
+按视图暴露、按需挂载 Skills,只把用得到的技能放进上下文,
+[AgentSight](https://agentic-os.sh/zh/docs/user-guide/agent-observability/agentsight/)
记录 Token 实际花在哪。
### 使用 Claude Code,3 分钟体验 Token-less
@@ -108,13 +140,6 @@ tokenless stats list --limit 5
-
-
-
-
`debug`、`trace` 命中字段黑名单,`metadata` 为 null,`tags` / `extra` 为空值,
均被移除。压缩在 Agent 与模型之间执行,无需改动 Agent 框架代码;被截断的数组
元素可通过 `<>` 标记取回,压缩过程可逆。
@@ -125,17 +150,19 @@ tokenless stats list --limit 5
| ResponseCompressor · 46.85 µs | SchemaCompressor · 11.44 µs | 198.91 µs |
节省比例针对进入上下文的工具响应,不代表整个会话的账单。具体工作负载的估算方法
-见 [Token-less README](src/tokenless/README_zh.md)。
+见 [Token-less 用户手册](https://agentic-os.sh/zh/docs/user-guide/token-saving/tokenless/user-manual/)。
03 · EXECUTION RUNTIME
让 Agent 的每次执行都有边界,也留有退路
ANOLISA 正在完善面向 Agent 的执行环境。
-[Agent Sec Core](src/agent-sec-core/README_zh.md) 隔离高风险操作,
-[ws-ckpt](src/ws-ckpt/README_zh.md) 为工作区变更保留恢复点。
+[Agent Sec Core](https://agentic-os.sh/zh/docs/user-guide/agent-security/agent-sec-core/quickstart/)
+隔离高风险操作,[ws-ckpt](https://agentic-os.sh/zh/docs/user-guide/runtime/ws-ckpt/)
+为工作区变更保留恢复点。
-[通过 ANOLISA CLI 开始 →](docs/user-guide/zh/user-entrypoint/anolisa-cli.md)
+[选择运行与安全能力的开始位置 →](https://agentic-os.sh/zh/docs/quickstart/)
+· [通过 ANOLISA CLI 开始](https://agentic-os.sh/zh/docs/user-guide/user-entrypoint/anolisa-cli/)
## 安装
@@ -152,16 +179,16 @@ anolisa install tokenless
运行 `cosh` 进入 AI 原生终端。Token-less 也可直接优化现有 Agent 的工具调用,
无需更换 Agent 框架。
-[查看快速开始 →](docs/QUICKSTART_zh.md)
+[查看快速开始 →](https://agentic-os.sh/zh/docs/quickstart/)
## 文档
-[快速开始](docs/QUICKSTART_zh.md) ·
-[安装指南](docs/user-guide/zh/installation.md) ·
-[用户指南](docs/user-guide/zh/README.md) ·
-[故障排查](docs/user-guide/zh/troubleshooting.md) ·
-[源码构建](docs/BUILDING_zh.md) ·
-[变更日志](CHANGELOG_zh.md)
+[快速开始](https://agentic-os.sh/zh/docs/quickstart/) ·
+[安装指南](https://agentic-os.sh/zh/docs/user-guide/installation/) ·
+[用户指南](https://agentic-os.sh/zh/docs/user-guide/) ·
+[故障排查](https://agentic-os.sh/zh/docs/user-guide/troubleshooting/) ·
+[源码构建](https://agentic-os.sh/zh/docs/building/) ·
+[变更日志](https://agentic-os.sh/zh/changelog/)
## 社区
@@ -174,9 +201,12 @@ anolisa install tokenless
- 遇到问题或有新的 Agent 场景,欢迎[提交 Issue](https://github.com/alibaba/anolisa/issues)。
-- 提交 Pull Request 前,请先阅读[贡献指南](CONTRIBUTING_zh.md)。
-- 安全问题请通过[安全策略](SECURITY.md)中的渠道报告。
+- 提交 Pull Request 前,请先阅读
+ [贡献指南](https://github.com/alibaba/anolisa/blob/main/CONTRIBUTING_zh.md)。
+- 安全问题请通过
+ [安全策略](https://github.com/alibaba/anolisa/blob/main/SECURITY.md)中的渠道报告。
## 许可证
-ANOLISA 基于 [Apache License 2.0](LICENSE) 发布。
+ANOLISA 基于
+[Apache License 2.0](https://github.com/alibaba/anolisa/blob/main/LICENSE) 发布。
diff --git a/website/src/css/custom.css b/website/src/css/custom.css
index d557928e26..4ed3a759a2 100644
--- a/website/src/css/custom.css
+++ b/website/src/css/custom.css
@@ -506,6 +506,3222 @@ html:has(.homePage) .footer {
transform: translateX(3px);
}
+.tokenFeatureSection {
+ --token-bg: var(--site-bg);
+ --token-panel: var(--site-panel);
+ --token-panel-strong: var(--site-panel-strong);
+ --token-line: var(--site-line);
+ --token-ink: var(--site-ink);
+ --token-muted: var(--site-muted);
+ --token-signal: var(--site-signal);
+ --token-keep: var(--site-amber);
+ min-height: calc(100vh - var(--ifm-navbar-height));
+ display: flex;
+ align-items: center;
+ overflow: hidden;
+ border-bottom: 1px solid var(--token-line);
+ color: var(--token-ink);
+ background:
+ linear-gradient(color-mix(in srgb, var(--token-signal) 5%, transparent) 1px, transparent 1px),
+ linear-gradient(90deg, color-mix(in srgb, var(--token-signal) 5%, transparent) 1px, transparent 1px),
+ radial-gradient(circle at 20% 30%, color-mix(in srgb, var(--token-signal) 14%, transparent), transparent 34%),
+ radial-gradient(circle at 86% 76%, color-mix(in srgb, var(--token-keep) 9%, transparent), transparent 28%),
+ var(--token-bg);
+ background-size: 30px 30px, 30px 30px, auto, auto, auto;
+}
+
+.tokenFeatureSection--cyan {
+ --token-signal: var(--site-cyan);
+}
+
+.tokenFeatureSection--lime {
+ --token-signal: var(--site-lime);
+}
+
+.tokenFeatureSection--amber {
+ --token-signal: var(--site-amber);
+}
+
+.tokenFeatureInner {
+ padding-block: clamp(54px, 7vh, 78px);
+}
+
+.tokenFeatureHeading {
+ display: grid;
+ grid-template-columns: minmax(0, 1fr) minmax(240px, 330px);
+ gap: 48px;
+ align-items: end;
+ margin-bottom: 28px;
+ opacity: 1;
+ filter: blur(0);
+ transform: translateY(0);
+ transition:
+ opacity 180ms ease,
+ filter 180ms ease,
+ transform 420ms cubic-bezier(0.16, 1, 0.3, 1);
+}
+
+.tokenFeatureHeading--leaving {
+ opacity: 0;
+ filter: blur(2px);
+ transform: translateY(8px);
+}
+
+.tokenFeatureHeading > div {
+ max-width: 790px;
+}
+
+.tokenFeatureEyebrow {
+ margin: 0 0 14px;
+ color: var(--token-signal);
+ font: 600 0.68rem var(--ifm-font-family-monospace);
+ letter-spacing: 0.12em;
+}
+
+.tokenFeatureHeading h2 {
+ margin: 0;
+ font-size: clamp(2rem, 3.7vw, 4rem);
+ line-height: 1.04;
+ letter-spacing: -0.052em;
+ text-wrap: balance;
+}
+
+.tokenFeatureIntro {
+ max-width: 750px;
+ margin: 15px 0 0;
+ color: var(--token-muted);
+ font-size: 0.94rem;
+ line-height: 1.62;
+ text-wrap: pretty;
+}
+
+.tokenFeatureBenchmark {
+ display: grid;
+ gap: 8px;
+ margin: 0;
+ color: var(--token-muted);
+ font: 0.65rem/1.55 var(--ifm-font-family-monospace);
+ text-align: right;
+ text-wrap: pretty;
+}
+
+.tokenFeatureBenchmark a {
+ color: var(--token-signal);
+ text-decoration: none;
+}
+
+.tokenFeatureBenchmark a:hover {
+ color: var(--token-ink);
+ text-decoration: none;
+}
+
+.tokenFeatureLayout {
+ display: grid;
+ min-height: 500px;
+ grid-template-columns: minmax(0, 1fr) 292px;
+ gap: 16px;
+}
+
+.tokenWorkbench {
+ min-width: 0;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ border: 1px solid var(--token-line);
+ background: color-mix(in srgb, var(--token-panel) 88%, transparent);
+ box-shadow: 18px 20px 0 color-mix(in srgb, var(--token-signal) 4%, transparent);
+}
+
+.tokenWorkbenchHeader {
+ min-height: 58px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 20px;
+ padding: 11px 16px;
+ border-bottom: 1px solid var(--token-line);
+ background: color-mix(in srgb, var(--token-panel-strong) 72%, transparent);
+}
+
+.tokenDemoTabs {
+ min-width: 0;
+ display: flex;
+ gap: 6px;
+}
+
+.tokenDemoTab {
+ display: inline-flex;
+ align-items: center;
+ gap: 7px;
+ padding: 7px 10px;
+ border: 1px solid transparent;
+ border-radius: 2px;
+ background: transparent;
+ color: var(--token-muted);
+ cursor: pointer;
+ font: 600 0.62rem var(--ifm-font-family-monospace);
+ letter-spacing: 0.04em;
+ text-transform: uppercase;
+}
+
+.tokenDemoTab:hover {
+ color: var(--token-ink);
+}
+
+.tokenDemoTab:focus-visible,
+.tokenRailGroup button:focus-visible,
+.tokenFeatureBenchmark a:focus-visible {
+ outline: 2px solid var(--token-signal);
+ outline-offset: 2px;
+}
+
+.tokenDemoTab--active {
+ border-color: var(--token-line);
+ background: color-mix(in srgb, var(--token-signal) 9%, transparent);
+ color: var(--token-ink);
+}
+
+.tokenDemoTab span {
+ color: var(--token-signal);
+}
+
+.tokenMetric {
+ flex: 0 0 auto;
+ display: grid;
+ justify-items: end;
+ font-family: var(--ifm-font-family-monospace);
+ white-space: nowrap;
+}
+
+.tokenMetric span {
+ color: var(--token-muted);
+ font-size: 0.55rem;
+ letter-spacing: 0.07em;
+ text-transform: uppercase;
+}
+
+.tokenMetric strong {
+ color: var(--token-signal);
+ font-size: 0.82rem;
+}
+
+.capabilityModeLabel {
+ min-width: 0;
+ display: flex;
+ align-items: center;
+ gap: 9px;
+ color: var(--token-ink);
+ font-family: var(--ifm-font-family-monospace);
+}
+
+.capabilityModeLabel > span {
+ width: 30px;
+ height: 30px;
+ display: grid;
+ place-items: center;
+ border: 1px solid var(--token-line);
+ background: color-mix(in srgb, var(--token-signal) 10%, transparent);
+ color: var(--token-signal);
+ font-size: 0.7rem;
+}
+
+.capabilityModeLabel strong {
+ font-size: 0.72rem;
+ letter-spacing: 0.04em;
+ text-transform: uppercase;
+}
+
+.capabilityModeLabel small {
+ padding-left: 9px;
+ border-left: 1px solid var(--token-line);
+ color: var(--token-muted);
+ font-size: 0.55rem;
+}
+
+.capabilityVisualShell {
+ flex: 1;
+ min-height: 0;
+ opacity: 1;
+ filter: blur(0);
+ transform: translateY(0);
+ transition:
+ opacity 180ms ease,
+ filter 180ms ease,
+ transform 420ms cubic-bezier(0.16, 1, 0.3, 1);
+}
+
+.capabilityVisualShell--leaving {
+ opacity: 0;
+ filter: blur(2px);
+ transform: translateY(8px);
+}
+
+.capabilityCanvas {
+ min-height: 322px;
+ height: 100%;
+ padding: 16px;
+ font-family: var(--ifm-font-family-monospace);
+}
+
+.coshCanvas {
+ display: grid;
+ grid-template-columns: 226px minmax(0, 1fr);
+ gap: 22px;
+ background:
+ radial-gradient(circle at 68% 48%, color-mix(in srgb, var(--site-cyan) 13%, transparent), transparent 36%),
+ color-mix(in srgb, var(--token-bg) 38%, transparent);
+}
+
+.coshStage {
+ position: relative;
+ min-width: 0;
+ min-height: 395px;
+ overflow: hidden;
+ border: 1px solid color-mix(in srgb, var(--site-cyan) 34%, var(--token-line));
+ background:
+ linear-gradient(180deg, color-mix(in srgb, var(--site-cyan) 4%, transparent), transparent 38%),
+ color-mix(in srgb, var(--token-panel-strong) 88%, transparent);
+ box-shadow: inset 0 0 62px color-mix(in srgb, var(--site-cyan) 5%, transparent);
+}
+
+.coshHandoffScene,
+.coshInsightScene,
+.coshHealthScene {
+ position: absolute;
+ inset: 45px 0 0;
+ padding: 22px 26px 50px;
+ animation: coshSceneIn 520ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.coshPromptLine {
+ min-height: 48px;
+ display: grid;
+ grid-template-columns: auto 1fr auto;
+ align-items: center;
+ gap: 12px;
+ padding: 0 16px;
+ border: 1px solid color-mix(in srgb, var(--site-cyan) 30%, var(--token-line));
+ background: color-mix(in srgb, var(--token-bg) 72%, transparent);
+ color: var(--token-ink);
+ font-size: 0.72rem;
+}
+
+.coshPromptLine > span,
+.coshPlanCard > header span,
+.coshPlanCard > footer span,
+.coshInsightCard > p,
+.coshHealthSuggestion > p {
+ overflow-wrap: break-word;
+ line-break: strict;
+ text-wrap: pretty;
+}
+
+.coshPromptLine b {
+ color: var(--site-cyan);
+ font-size: 1rem;
+}
+
+.coshPromptLine i,
+.coshLoginPrompt strong i {
+ width: 7px;
+ height: 17px;
+ display: block;
+ background: var(--site-cyan);
+ animation: coshCursorBlink 1s steps(1) infinite;
+}
+
+.coshPlanCard {
+ width: min(92%, 560px);
+ margin: 18px auto 0;
+ overflow: hidden;
+ border: 1px solid color-mix(in srgb, var(--site-amber) 62%, var(--token-line));
+ background: color-mix(in srgb, var(--site-amber) 8%, var(--token-panel));
+ box-shadow:
+ -4px 0 0 var(--site-amber),
+ 0 18px 44px color-mix(in srgb, #000 40%, transparent);
+ animation: coshCardRise 620ms 120ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.coshPlanCard > header,
+.coshPlanCard > footer {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 10px;
+ padding: 10px 14px;
+}
+
+.coshPlanCard > header {
+ border-bottom: 1px solid var(--token-line);
+ color: var(--token-ink);
+ font-size: 0.64rem;
+}
+
+.coshPlanCard > header b {
+ color: var(--site-amber);
+ font-size: 0.56rem;
+}
+
+.coshPlanCard > code {
+ display: block;
+ padding: 16px 14px;
+ border: 0;
+ background: transparent;
+ color: var(--token-ink);
+ font-size: 0.78rem;
+}
+
+.coshPlanCard > footer {
+ border-top: 1px solid var(--token-line);
+ color: var(--token-muted);
+ font-size: 0.59rem;
+}
+
+.coshPlanCard > footer strong {
+ padding: 6px 10px;
+ border: 1px solid color-mix(in srgb, var(--site-amber) 65%, transparent);
+ color: var(--site-amber);
+}
+
+.coshTtyHandoff {
+ width: min(82%, 500px);
+ margin: 13px auto 0;
+ animation: coshCardRise 620ms 300ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.coshTtyHandoff > div {
+ min-height: 42px;
+ display: grid;
+ grid-template-columns: auto 1fr auto;
+ align-items: center;
+ gap: 10px;
+ padding: 0 12px;
+ border: 1px solid var(--token-line);
+ background: color-mix(in srgb, var(--token-bg) 74%, transparent);
+ color: var(--token-ink);
+ font-size: 0.62rem;
+}
+
+.coshTtyHandoff > div span,
+.coshTtyHandoff > div b {
+ color: var(--site-cyan);
+}
+
+.coshTtyHandoff > p {
+ width: max-content;
+ margin: 8px 0 0 auto;
+ padding: 5px 9px;
+ border: 1px solid color-mix(in srgb, var(--site-cyan) 40%, transparent);
+ background: color-mix(in srgb, var(--site-cyan) 8%, transparent);
+ color: var(--site-cyan);
+ font-size: 0.59rem;
+}
+
+.coshTtyHandoff > p i {
+ width: 6px;
+ height: 6px;
+ display: inline-block;
+ margin-right: 5px;
+ border-radius: 50%;
+ background: currentColor;
+ box-shadow: 0 0 10px currentColor;
+}
+
+.coshSceneClaim {
+ position: absolute;
+ right: 26px;
+ bottom: 18px;
+ left: 26px;
+ color: var(--site-cyan);
+ font-family: var(--ifm-font-family-base);
+ font-size: clamp(0.84rem, 1.4vw, 1.05rem);
+ font-weight: 650;
+ text-align: center;
+ text-wrap: balance;
+}
+
+.coshInsightScene {
+ display: grid;
+ grid-template-columns: minmax(0, 1fr) minmax(230px, 0.9fr);
+ align-content: center;
+ gap: 16px;
+}
+
+.coshCommandRun {
+ grid-row: span 2;
+ align-self: stretch;
+ display: grid;
+ align-content: center;
+ gap: 14px;
+ padding: 20px;
+ border: 1px solid var(--token-line);
+ background: color-mix(in srgb, var(--token-bg) 72%, transparent);
+}
+
+.coshCommandRun p {
+ margin: 0;
+ color: var(--token-ink);
+ font-size: 0.74rem;
+}
+
+.coshCommandRun p span {
+ margin-right: 8px;
+ color: var(--site-cyan);
+}
+
+.coshCommandRun code {
+ border: 0;
+ background: transparent;
+ color: var(--token-muted);
+ font-size: 0.67rem;
+ line-height: 1.7;
+}
+
+.coshCommandRun code b {
+ color: var(--site-amber);
+}
+
+.coshInsightCard {
+ overflow: hidden;
+ border: 1px solid color-mix(in srgb, var(--site-amber) 56%, var(--token-line));
+ background: color-mix(in srgb, var(--site-amber) 8%, var(--token-panel));
+ box-shadow: 0 0 30px color-mix(in srgb, var(--site-amber) 10%, transparent);
+ animation: coshCardRise 620ms 180ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.coshInsightCard > header {
+ display: flex;
+ align-items: center;
+ gap: 9px;
+ padding: 11px 13px 7px;
+ color: var(--site-amber);
+ font-size: 0.7rem;
+}
+
+.coshInsightCard > header i {
+ width: 24px;
+ height: 24px;
+ display: grid;
+ place-items: center;
+ border: 1px solid currentColor;
+ border-radius: 50%;
+ font-style: normal;
+}
+
+.coshInsightCard > p {
+ margin: 0;
+ padding: 7px 13px 12px;
+ color: var(--token-ink);
+ font-family: var(--ifm-font-family-base);
+ font-size: 0.72rem;
+ line-height: 1.5;
+}
+
+.coshInsightCard > footer {
+ display: flex;
+ align-items: center;
+ gap: 5px;
+ padding: 9px 13px;
+ border-top: 1px solid var(--token-line);
+ color: var(--token-muted);
+ font-size: 0.52rem;
+}
+
+.coshInsightCard kbd,
+.coshHealthSuggestion kbd {
+ padding: 3px 6px;
+ border: 1px solid color-mix(in srgb, var(--site-cyan) 46%, var(--token-line));
+ background: var(--token-panel-strong);
+ color: var(--site-cyan);
+ font-size: 0.53rem;
+}
+
+.coshInsightCard > footer small {
+ margin-left: auto;
+}
+
+.coshDiagnosis {
+ display: grid;
+ gap: 4px;
+ padding: 11px 13px;
+ border: 1px solid var(--token-line);
+ background: color-mix(in srgb, var(--site-cyan) 6%, var(--token-panel));
+ animation: coshCardRise 620ms 360ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.coshDiagnosis span,
+.coshDiagnosis small {
+ color: var(--site-cyan);
+ font-size: 0.55rem;
+}
+
+.coshDiagnosis strong {
+ color: var(--token-ink);
+ font-size: 0.68rem;
+}
+
+.coshDiagnosis small {
+ color: color-mix(in srgb, var(--site-cyan) 72%, var(--token-muted));
+}
+
+.coshHealthScene {
+ display: grid;
+ grid-template-columns: minmax(0, 0.78fr) minmax(260px, 1.22fr);
+ align-content: center;
+ gap: 15px;
+}
+
+.coshLoginPrompt {
+ align-self: stretch;
+ display: grid;
+ align-content: center;
+ gap: 20px;
+ padding: 20px;
+ border: 1px solid var(--token-line);
+ background: color-mix(in srgb, var(--token-bg) 72%, transparent);
+}
+
+.coshLoginPrompt > span {
+ color: var(--token-muted);
+ font-size: 0.6rem;
+}
+
+.coshLoginPrompt > strong {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ color: var(--site-cyan);
+ font-size: 1rem;
+}
+
+.coshHealthCard {
+ overflow: hidden;
+ border: 1px solid color-mix(in srgb, var(--site-cyan) 48%, var(--token-line));
+ background: color-mix(in srgb, var(--site-cyan) 6%, var(--token-panel));
+ box-shadow: 0 0 32px color-mix(in srgb, var(--site-cyan) 9%, transparent);
+ animation: coshCardRise 620ms 100ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.coshHealthCard > header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 10px 13px;
+ border-bottom: 1px solid var(--token-line);
+ color: var(--token-ink);
+ font-size: 0.66rem;
+}
+
+.coshHealthCard > header b {
+ color: var(--site-amber);
+ font-size: 0.55rem;
+}
+
+.coshVitals {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 10px;
+ padding: 13px;
+}
+
+.coshVitals span {
+ position: relative;
+ min-width: 0;
+ display: grid;
+ gap: 4px;
+ padding-top: 20px;
+ color: var(--token-muted);
+ font-size: 0.54rem;
+}
+
+.coshVitals span > i {
+ position: absolute;
+ inset: 0 0 auto;
+ height: 8px;
+ overflow: hidden;
+ border-radius: 999px;
+ background: color-mix(in srgb, var(--token-line) 75%, transparent);
+}
+
+.coshVitals span > i::after {
+ content: '';
+ display: block;
+ width: var(--health-level);
+ height: 100%;
+ border-radius: inherit;
+ background: var(--site-cyan);
+ box-shadow: 0 0 8px var(--site-cyan);
+ animation: coshVitalGrow 760ms 240ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.coshVitals b {
+ color: var(--token-ink);
+ font-size: 0.65rem;
+}
+
+.coshHealthCard > section {
+ display: flex;
+ align-items: center;
+ gap: 11px;
+ margin: 0 13px 13px;
+ padding: 11px;
+ border: 1px solid color-mix(in srgb, var(--site-amber) 55%, var(--token-line));
+ background: color-mix(in srgb, var(--site-amber) 8%, transparent);
+ color: var(--site-amber);
+}
+
+.coshHealthCard > section > i {
+ width: 27px;
+ height: 27px;
+ display: grid;
+ flex: 0 0 auto;
+ place-items: center;
+ border: 1px solid currentColor;
+ border-radius: 50%;
+ font-style: normal;
+}
+
+.coshHealthCard > section div {
+ display: grid;
+ gap: 4px;
+}
+
+.coshHealthCard > section strong {
+ color: var(--token-ink);
+ font-size: 0.68rem;
+}
+
+.coshHealthCard > section small {
+ color: var(--token-muted);
+ font-size: 0.56rem;
+}
+
+.coshHealthSuggestion {
+ grid-column: 1 / -1;
+ display: grid;
+ grid-template-columns: auto 1fr auto;
+ align-items: center;
+ gap: 12px;
+ padding: 12px 14px;
+ border: 1px solid color-mix(in srgb, var(--site-cyan) 35%, var(--token-line));
+ background: color-mix(in srgb, var(--token-bg) 68%, transparent);
+ animation: coshCardRise 620ms 320ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.coshHealthSuggestion > span {
+ color: var(--site-cyan);
+ font-size: 0.54rem;
+}
+
+.coshHealthSuggestion > p {
+ margin: 0;
+ color: var(--token-ink);
+ font-family: var(--ifm-font-family-base);
+ font-size: 0.66rem;
+ line-height: 1.45;
+}
+
+.coshHealthSuggestion > small {
+ color: var(--token-muted);
+ font-size: 0.5rem;
+ white-space: nowrap;
+}
+
+@keyframes coshSceneIn {
+ from {
+ opacity: 0;
+ transform: translateY(10px);
+ }
+}
+
+@keyframes coshCardRise {
+ from {
+ opacity: 0;
+ transform: translateY(16px) scale(0.98);
+ }
+}
+
+@keyframes coshCursorBlink {
+ 50% {
+ opacity: 0;
+ }
+}
+
+@keyframes coshVitalGrow {
+ from {
+ width: 0;
+ }
+}
+
+.sightCanvas {
+ display: grid;
+ grid-template-columns: 226px minmax(0, 1fr);
+ gap: 22px;
+ background:
+ radial-gradient(circle at 68% 46%, color-mix(in srgb, var(--site-lime) 12%, transparent), transparent 35%),
+ color-mix(in srgb, var(--token-bg) 38%, transparent);
+}
+
+.capabilityFeaturePicker {
+ display: grid;
+ align-content: center;
+ gap: 8px;
+}
+
+.capabilityFeaturePicker button {
+ display: grid;
+ gap: 5px;
+ padding: 13px 14px;
+ border: 1px solid transparent;
+ background: transparent;
+ color: var(--token-muted);
+ cursor: pointer;
+ font-family: var(--ifm-font-family-monospace);
+ text-align: left;
+ transition:
+ border-color 180ms ease,
+ background 180ms ease,
+ color 180ms ease,
+ transform 280ms cubic-bezier(0.16, 1, 0.3, 1);
+}
+
+.capabilityFeaturePicker button:hover,
+.capabilityFeaturePicker button.is-active {
+ border-color: color-mix(in srgb, var(--token-signal) 44%, var(--token-line));
+ background: color-mix(in srgb, var(--token-signal) 8%, transparent);
+ color: var(--token-ink);
+ transform: translateX(5px);
+}
+
+.capabilityFeaturePicker button:focus-visible {
+ outline: 2px solid var(--token-signal);
+ outline-offset: 2px;
+}
+
+.capabilityFeaturePicker span {
+ font-size: 0.83rem;
+ font-weight: 700;
+ text-wrap: balance;
+}
+
+.capabilityFeaturePicker small {
+ color: var(--token-muted);
+ font-size: 0.67rem;
+ line-height: 1.5;
+ overflow-wrap: break-word;
+ line-break: strict;
+ text-wrap: pretty;
+}
+
+.sightStage {
+ position: relative;
+ min-width: 0;
+ min-height: 326px;
+ overflow: hidden;
+ background:
+ radial-gradient(circle at 54% 45%, color-mix(in srgb, var(--site-lime) 7%, transparent), transparent 48%),
+ linear-gradient(180deg, color-mix(in srgb, var(--token-panel) 55%, transparent), transparent);
+ animation: capabilitySceneIn 420ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.sightStageHeader {
+ position: absolute;
+ z-index: 5;
+ top: 11px;
+ right: 14px;
+ left: 14px;
+ display: flex;
+ justify-content: space-between;
+ color: var(--token-muted);
+ font-size: 0.64rem;
+}
+
+.sightStageHeader span {
+ display: flex;
+ align-items: center;
+ gap: 7px;
+}
+
+.sightStageHeader i {
+ width: 7px;
+ height: 7px;
+ border-radius: 50%;
+ background: var(--site-lime);
+ box-shadow: 0 0 13px var(--site-lime);
+ animation: checkpointHeadPulse 1.4s ease-in-out infinite;
+}
+
+.sightStageHeader b {
+ color: var(--site-lime);
+}
+
+.sightInvocationFlow,
+.sightTokenChart,
+.sightTopologyFlow {
+ position: absolute;
+ inset: 42px 12px 10px;
+}
+
+.sightInvocationFlow {
+ display: grid;
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ gap: 14px;
+ align-items: center;
+ padding: 24px 10px 48px;
+}
+
+.sightInvocationFlow::before {
+ position: absolute;
+ top: calc(50% - 16px);
+ right: 8%;
+ left: 8%;
+ height: 2px;
+ background: linear-gradient(
+ 90deg,
+ color-mix(in srgb, var(--site-cyan) 45%, transparent),
+ var(--site-lime) 66%,
+ var(--site-amber)
+ );
+ content: '';
+ opacity: 0.7;
+}
+
+.sightInvocationStep {
+ position: relative;
+ z-index: 2;
+ display: grid;
+ min-width: 0;
+ min-height: 150px;
+ align-content: center;
+ justify-items: start;
+ gap: 8px;
+ padding: 17px 15px;
+ border: 1px solid color-mix(in srgb, var(--site-cyan) 38%, var(--token-line));
+ background: color-mix(in srgb, var(--token-panel-strong) 90%, transparent);
+ box-shadow: 0 14px 34px color-mix(in srgb, var(--token-bg) 65%, transparent);
+ animation: sightInvocationFocus 4.8s ease-in-out infinite;
+}
+
+.sightInvocationStep:nth-of-type(2) {
+ animation-delay: 0.8s;
+}
+
+.sightInvocationStep:nth-of-type(3) {
+ animation-delay: 1.6s;
+}
+
+.sightInvocationStep:nth-of-type(4) {
+ animation-delay: 2.4s;
+}
+
+.sightInvocationStep > span {
+ position: absolute;
+ top: 10px;
+ right: 11px;
+ color: var(--token-muted);
+ font: 600 0.58rem var(--ifm-font-family-monospace);
+ letter-spacing: 0.1em;
+}
+
+.sightInvocationStep > i {
+ display: grid;
+ width: 38px;
+ height: 38px;
+ place-items: center;
+ border: 1px solid color-mix(in srgb, var(--site-cyan) 58%, var(--token-line));
+ border-radius: 50%;
+ color: var(--site-cyan);
+ font-style: normal;
+ font-weight: 700;
+}
+
+.sightInvocationStep > small {
+ color: var(--token-muted);
+ font: 700 0.64rem var(--ifm-font-family-monospace);
+ letter-spacing: 0.08em;
+}
+
+.sightInvocationStep > strong {
+ max-width: 100%;
+ color: var(--token-ink);
+ font-size: 0.78rem;
+ line-height: 1.42;
+ overflow-wrap: anywhere;
+}
+
+.sightInvocationStep--agent {
+ border-color: color-mix(in srgb, var(--site-lime) 48%, var(--token-line));
+}
+
+.sightInvocationStep--agent > i,
+.sightInvocationStep--llm > i {
+ border-color: color-mix(in srgb, var(--site-lime) 65%, var(--token-line));
+ color: var(--site-lime);
+}
+
+.sightInvocationStep--llm {
+ border-color: color-mix(in srgb, var(--site-lime) 72%, var(--token-line));
+ background:
+ radial-gradient(circle at 30% 20%, color-mix(in srgb, var(--site-lime) 16%, transparent), transparent 48%),
+ color-mix(in srgb, var(--token-panel-strong) 94%, transparent);
+}
+
+.sightInvocationStep--tool {
+ border-color: color-mix(in srgb, var(--site-amber) 72%, var(--token-line));
+}
+
+.sightInvocationStep--tool > i {
+ border-color: var(--site-amber);
+ color: var(--site-amber);
+}
+
+.sightInvocationStep--tool > em {
+ color: var(--site-amber);
+ font: 600 0.62rem var(--ifm-font-family-monospace);
+ font-style: normal;
+}
+
+.sightInvocationRunner {
+ position: absolute;
+ z-index: 4;
+ top: calc(50% - 20px);
+ left: 7%;
+ width: 9px;
+ height: 9px;
+ border-radius: 50%;
+ background: var(--site-lime);
+ box-shadow: 0 0 14px var(--site-lime);
+ animation: sightInvocationTravel 4.8s cubic-bezier(0.45, 0, 0.55, 1) infinite;
+}
+
+.sightInvocationFlow > p,
+.sightTopologyFlow > p {
+ position: absolute;
+ right: 5%;
+ bottom: 2%;
+ left: 5%;
+ margin: 0;
+ color: var(--token-ink);
+ font-size: 0.78rem;
+ line-height: 1.55;
+ text-align: center;
+}
+
+.sightTokenLegend {
+ display: flex;
+ justify-content: center;
+ gap: 18px;
+ color: var(--token-muted);
+ font-size: 0.58rem;
+}
+
+.sightTokenLegend span:nth-child(4) {
+ color: var(--site-amber);
+}
+
+.sightTokenColumns {
+ position: absolute;
+ inset: 34px 5% 38px;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-around;
+ gap: 14px;
+}
+
+.sightTokenColumn {
+ position: relative;
+ width: clamp(36px, 8%, 56px);
+ height: var(--column-height);
+ display: flex;
+ flex-direction: column-reverse;
+ justify-content: stretch;
+ filter: saturate(0.7);
+ animation: sightColumnGrow 650ms cubic-bezier(0.16, 1, 0.3, 1) both;
+ transform-origin: bottom;
+}
+
+.sightTokenColumn:nth-child(2) { animation-delay: 70ms; }
+.sightTokenColumn:nth-child(3) { animation-delay: 140ms; }
+.sightTokenColumn:nth-child(4) { animation-delay: 210ms; }
+.sightTokenColumn:nth-child(5) { animation-delay: 280ms; }
+.sightTokenColumn:nth-child(6) { animation-delay: 350ms; }
+
+.sightTokenColumn i {
+ flex: 1;
+ border-top: 1px solid color-mix(in srgb, var(--token-bg) 70%, transparent);
+ background: color-mix(in srgb, var(--site-cyan) 35%, var(--token-panel));
+}
+
+.sightTokenColumn i:nth-child(2) { background: color-mix(in srgb, var(--site-lime) 50%, var(--token-panel)); }
+.sightTokenColumn i:nth-child(3) { background: color-mix(in srgb, #9f7aea 46%, var(--token-panel)); }
+.sightTokenColumn i:nth-child(4) { flex: 1.4; background: color-mix(in srgb, var(--site-amber) 64%, var(--token-panel)); }
+.sightTokenColumn i:nth-child(5) { background: color-mix(in srgb, #ef6fae 40%, var(--token-panel)); }
+
+.sightTokenColumn small {
+ position: absolute;
+ top: calc(100% + 7px);
+ width: 100%;
+ color: var(--token-muted);
+ font-size: 0.54rem;
+ text-align: center;
+}
+
+.sightTokenColumn.is-peak {
+ filter: none;
+ box-shadow: 0 0 24px color-mix(in srgb, var(--site-amber) 24%, transparent);
+}
+
+.sightTokenColumn.is-peak i:nth-child(4) {
+ box-shadow: inset 0 0 18px color-mix(in srgb, var(--site-amber) 35%, transparent);
+ animation: sightPeakPulse 1.8s ease-in-out infinite;
+}
+
+.sightOutputCurve {
+ position: absolute;
+ inset: 62px 5% 48px;
+ width: 90%;
+ height: calc(100% - 110px);
+ overflow: visible;
+ pointer-events: none;
+}
+
+.sightOutputCurve path {
+ fill: none;
+ stroke: #ef6fae;
+ stroke-width: 2;
+ stroke-dasharray: 420;
+ filter: drop-shadow(0 0 6px color-mix(in srgb, #ef6fae 60%, transparent));
+ animation: sightCurveDraw 1.1s 260ms ease both;
+}
+
+.sightTokenChart > p {
+ position: absolute;
+ right: 2%;
+ bottom: 2%;
+ left: 2%;
+ display: flex;
+ justify-content: space-between;
+ margin: 0;
+ color: var(--token-ink);
+ font-size: 0.72rem;
+}
+
+.sightTokenChart > p span {
+ color: var(--site-amber);
+ font-size: 0.62rem;
+}
+
+.sightTopologyFlow {
+ display: grid;
+ grid-template-columns: minmax(0, 1fr) 52px minmax(0, 1fr) minmax(0, 1.12fr);
+ gap: 14px;
+ align-items: center;
+ padding: 18px 10px 54px;
+}
+
+.sightTopologyNode {
+ min-height: 142px;
+ animation: none;
+}
+
+.sightTopologyNode > em {
+ color: var(--token-muted);
+ font: 600 0.59rem var(--ifm-font-family-monospace);
+ font-style: normal;
+}
+
+.sightTopologyNode--root {
+ border-color: color-mix(in srgb, var(--site-cyan) 70%, var(--token-line));
+}
+
+.sightTopologyNode--research {
+ border-color: color-mix(in srgb, var(--site-lime) 62%, var(--token-line));
+}
+
+.sightTopologyLink {
+ position: relative;
+ height: 2px;
+ background: linear-gradient(90deg, var(--site-cyan), var(--site-lime));
+}
+
+.sightTopologyLink::after {
+ position: absolute;
+ top: 50%;
+ right: -1px;
+ width: 8px;
+ height: 8px;
+ border-top: 2px solid var(--site-lime);
+ border-right: 2px solid var(--site-lime);
+ content: '';
+ transform: translateY(-50%) rotate(45deg);
+}
+
+.sightTopologyLink > span {
+ position: absolute;
+ bottom: 7px;
+ left: 50%;
+ color: var(--token-muted);
+ font: 600 0.54rem var(--ifm-font-family-monospace);
+ letter-spacing: 0.08em;
+ transform: translateX(-50%);
+}
+
+.sightTopologyChildren {
+ position: relative;
+ display: grid;
+ gap: 10px;
+}
+
+.sightTopologyChildren::before {
+ position: absolute;
+ top: 25%;
+ bottom: 25%;
+ left: -15px;
+ width: 15px;
+ border-top: 1px solid color-mix(in srgb, var(--site-lime) 52%, var(--token-line));
+ border-bottom: 1px solid color-mix(in srgb, var(--site-lime) 52%, var(--token-line));
+ border-left: 1px solid color-mix(in srgb, var(--site-lime) 52%, var(--token-line));
+ content: '';
+}
+
+.sightTopologyChildren .sightTopologyNode {
+ min-height: 78px;
+ padding-block: 10px;
+ grid-template-columns: 32px 1fr;
+ align-content: center;
+ column-gap: 10px;
+}
+
+.sightTopologyChildren .sightTopologyNode > i {
+ width: 30px;
+ height: 30px;
+ grid-row: 1 / span 2;
+}
+
+.sightTopologyChildren .sightTopologyNode > small,
+.sightTopologyChildren .sightTopologyNode > strong {
+ grid-column: 2;
+}
+
+.sightTopologyNode--review {
+ opacity: 0.52;
+}
+
+.sightTopologyNode--test.is-active {
+ border-color: var(--site-lime);
+ background: color-mix(in srgb, var(--site-lime) 9%, var(--token-panel-strong));
+ box-shadow: 0 0 22px color-mix(in srgb, var(--site-lime) 24%, transparent);
+ animation: checkpointHeadPulse 1.8s ease-in-out infinite;
+}
+
+.sightTopologyPath {
+ position: absolute;
+ right: 4%;
+ bottom: 36px;
+ left: 4%;
+ display: flex;
+ justify-content: center;
+ gap: 8px;
+ color: var(--token-muted);
+ font: 600 0.6rem var(--ifm-font-family-monospace);
+}
+
+.sightTopologyPath strong {
+ color: var(--site-lime);
+}
+
+.sightInterruptionFlow::before {
+ background: linear-gradient(90deg, var(--site-lime), #ff8a80);
+}
+
+.sightInterruptionStep > i {
+ border-color: color-mix(in srgb, var(--site-lime) 60%, var(--token-line));
+ color: var(--site-lime);
+}
+
+.sightInterruptionStep--alert {
+ border-color: #ff746b;
+ background:
+ radial-gradient(circle at 28% 20%, color-mix(in srgb, #ff746b 18%, transparent), transparent 52%),
+ color-mix(in srgb, var(--token-panel-strong) 94%, transparent);
+ box-shadow: 0 0 26px color-mix(in srgb, #ff746b 22%, transparent);
+}
+
+.sightInterruptionStep--alert > i,
+.sightInterruptionStep--alert > small,
+.sightInterruptionStep--alert > em {
+ border-color: #ff746b;
+ color: #ff8a80;
+}
+
+.sightInterruptionStep--alert > em {
+ font: 700 0.62rem var(--ifm-font-family-monospace);
+ font-style: normal;
+}
+
+.sightInterruptionLoop {
+ position: absolute;
+ z-index: 3;
+ top: 4px;
+ right: 0;
+ width: 51%;
+ height: calc(100% - 54px);
+ border: 2px dashed color-mix(in srgb, #ff746b 72%, transparent);
+ border-radius: 50%;
+ pointer-events: none;
+ filter: drop-shadow(0 0 8px color-mix(in srgb, #ff746b 28%, transparent));
+}
+
+.sightInterruptionLoop > span {
+ position: absolute;
+ z-index: 5;
+ top: 50%;
+ left: 0;
+ display: grid;
+ width: 30px;
+ height: 30px;
+ place-items: center;
+ border: 1px solid #ff746b;
+ border-radius: 50%;
+ background: var(--token-panel-strong);
+ font-size: 1rem;
+ box-shadow: 0 0 14px color-mix(in srgb, #ff746b 52%, transparent);
+ animation: sightRobotLoop 3.4s linear infinite;
+}
+
+.sightInterruptionLoop > b {
+ position: absolute;
+ z-index: 5;
+ top: -9px;
+ left: 50%;
+ padding: 3px 8px;
+ background: var(--token-bg);
+ color: #ff8a80;
+ font: 700 0.58rem var(--ifm-font-family-monospace);
+ letter-spacing: 0.08em;
+ transform: translateX(-50%);
+}
+
+.checkpointCanvas {
+ display: grid;
+ grid-template-columns: 226px minmax(0, 1fr);
+ gap: 22px;
+ background:
+ radial-gradient(circle at 68% 46%, color-mix(in srgb, var(--site-amber) 13%, transparent), transparent 35%),
+ color-mix(in srgb, var(--token-bg) 38%, transparent);
+}
+
+.checkpointStage {
+ position: relative;
+ min-width: 0;
+ min-height: 326px;
+ overflow: hidden;
+ background:
+ radial-gradient(circle at 54% 45%, color-mix(in srgb, var(--site-amber) 8%, transparent), transparent 48%),
+ linear-gradient(180deg, color-mix(in srgb, var(--token-panel) 55%, transparent), transparent);
+ animation: capabilitySceneIn 420ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.featureStageHeader {
+ position: absolute;
+ z-index: 8;
+ top: 11px;
+ right: 14px;
+ left: 14px;
+ display: flex;
+ justify-content: space-between;
+ color: var(--token-muted);
+ font-size: 0.64rem;
+}
+
+.featureStageHeader span {
+ display: flex;
+ align-items: center;
+ gap: 7px;
+}
+
+.featureStageHeader i {
+ width: 7px;
+ height: 7px;
+ border-radius: 50%;
+ background: var(--token-signal);
+ box-shadow: 0 0 13px var(--token-signal);
+ animation: checkpointHeadPulse 1.4s ease-in-out infinite;
+}
+
+.featureStageHeader b {
+ color: var(--token-signal);
+}
+
+.checkpointHistory {
+ position: absolute;
+ inset: 40px 8px 8px;
+ overflow: hidden;
+}
+
+.checkpointHistory > svg {
+ position: absolute;
+ inset: 0;
+ width: 100%;
+ height: 100%;
+}
+
+.checkpointMainPath {
+ fill: none;
+ stroke: color-mix(in srgb, var(--site-cyan) 48%, var(--token-line));
+ stroke-width: 3;
+}
+
+.checkpointRollbackPath {
+ fill: none;
+ stroke: var(--site-amber);
+ stroke-width: 5;
+ stroke-linecap: round;
+ stroke-dasharray: 12 10;
+ filter: drop-shadow(0 0 8px color-mix(in srgb, var(--site-amber) 58%, transparent));
+ animation: checkpointRollbackTravel 1.8s linear infinite;
+}
+
+#rollback-arrow path {
+ fill: var(--site-amber);
+}
+
+.checkpointHistoryNode {
+ position: absolute;
+ width: 88px;
+ display: grid;
+ place-items: center;
+ gap: 4px;
+ color: var(--token-muted);
+ text-align: center;
+ transform: translate(-50%, -50%);
+}
+
+.checkpointHistoryNode > span {
+ width: 38px;
+ height: 38px;
+ display: grid;
+ place-items: center;
+ border: 2px solid var(--site-cyan);
+ border-radius: 50%;
+ background: var(--token-panel-strong);
+ color: var(--site-cyan);
+ font-size: 0.82rem;
+}
+
+.checkpointHistoryNode strong {
+ color: var(--token-ink);
+ font-size: 0.76rem;
+}
+
+.checkpointHistoryNode small {
+ font-size: 0.64rem;
+}
+
+.checkpointHistoryNode--baseline { top: 53%; left: 9.5%; }
+.checkpointHistoryNode--turn1 { top: 53%; left: 35.5%; }
+.checkpointHistoryNode--turn2 { top: 30%; left: 64.5%; }
+.checkpointHistoryNode--turn3 { top: 30%; left: 89.5%; }
+
+.checkpointHistoryNode--turn3 > span {
+ border-color: #ef6b63;
+ color: #ef6b63;
+ box-shadow: 0 0 20px color-mix(in srgb, #ef6b63 40%, transparent);
+}
+
+.checkpointHistoryNode--turn3 > b {
+ position: absolute;
+ top: -12px;
+ padding: 2px 7px;
+ background: #ef6b63;
+ color: var(--token-bg);
+ font-size: 0.54rem;
+}
+
+.checkpointRollbackLabel {
+ position: absolute;
+ z-index: 3;
+ top: 2%;
+ left: 48%;
+ display: grid;
+ gap: 4px;
+ padding: 8px 13px;
+ border: 1px solid color-mix(in srgb, var(--site-amber) 34%, var(--token-line));
+ background: var(--token-panel-strong);
+ color: var(--site-amber);
+ box-shadow: 0 8px 24px color-mix(in srgb, var(--token-bg) 58%, transparent);
+ text-align: center;
+ transform: translateX(-50%);
+}
+
+.checkpointRollbackLabel strong {
+ font-size: 1.12rem;
+}
+
+.checkpointRollbackLabel span {
+ font-size: 0.62rem;
+ letter-spacing: 0.04em;
+}
+
+.checkpointAutoScene,
+.checkpointPreviewScene,
+.checkpointBranchScene {
+ position: absolute;
+ inset: 42px 14px 12px;
+}
+
+.checkpointAutoScene {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ align-items: center;
+ gap: 10px;
+}
+
+.checkpointAutoLine {
+ position: absolute;
+ top: 47%;
+ right: 9%;
+ left: 9%;
+ height: 3px;
+ background: linear-gradient(90deg, var(--site-cyan), var(--site-amber));
+ opacity: 0.58;
+}
+
+.checkpointAutoScene > div:not(.checkpointAutoLine) {
+ z-index: 1;
+ display: grid;
+ place-items: center;
+ gap: 7px;
+ text-align: center;
+ animation: checkpointAutoSave 580ms var(--checkpoint-delay) cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.checkpointAutoScene > div > span {
+ width: 48px;
+ height: 48px;
+ display: grid;
+ place-items: center;
+ border: 2px solid var(--site-amber);
+ border-radius: 50%;
+ background: var(--token-panel-strong);
+ color: var(--site-amber);
+ box-shadow: 0 0 20px color-mix(in srgb, var(--site-amber) 22%, transparent);
+ font-size: 1rem;
+}
+
+.checkpointAutoScene > div > strong {
+ color: var(--token-ink);
+ font-size: 0.8rem;
+}
+
+.checkpointAutoScene > div > small {
+ color: var(--token-muted);
+ font-size: 0.64rem;
+}
+
+.checkpointAutoScene > p {
+ position: absolute;
+ right: 7%;
+ bottom: 2%;
+ left: 7%;
+ display: flex;
+ justify-content: space-between;
+ gap: 20px;
+ margin: 0;
+}
+
+.checkpointAutoScene > p strong {
+ color: var(--token-ink);
+ font-size: 0.8rem;
+}
+
+.checkpointAutoScene > p span {
+ color: var(--token-muted);
+ font-size: 0.64rem;
+}
+
+.checkpointPreviewScene {
+ display: grid;
+ grid-template-columns: minmax(135px, 0.65fr) 110px minmax(240px, 1.35fr);
+ align-items: center;
+ gap: 18px;
+}
+
+.checkpointWorkspaceState {
+ display: grid;
+ place-items: center;
+ gap: 8px;
+ padding: 22px 12px;
+ border: 1px solid var(--token-line);
+ background: color-mix(in srgb, var(--token-panel) 78%, transparent);
+ text-align: center;
+}
+
+.checkpointWorkspaceState > span {
+ padding: 3px 8px;
+ background: #ef6b63;
+ color: var(--token-bg);
+ font-size: 0.6rem;
+}
+
+.checkpointWorkspaceState strong {
+ color: var(--token-ink);
+ font-size: 1.15rem;
+}
+
+.checkpointWorkspaceState small {
+ color: var(--token-muted);
+ font-size: 0.62rem;
+}
+
+.checkpointPreviewArrow {
+ display: grid;
+ place-items: center;
+ gap: 8px;
+ color: var(--site-amber);
+ text-align: center;
+}
+
+.checkpointPreviewArrow span {
+ font-size: 1.5rem;
+ animation: checkpointHeadPulse 1.4s ease-in-out infinite;
+}
+
+.checkpointPreviewArrow b {
+ font-size: 0.58rem;
+}
+
+.checkpointDiffCard {
+ padding: 14px;
+ border: 1px solid color-mix(in srgb, var(--site-amber) 58%, var(--token-line));
+ background: color-mix(in srgb, var(--site-amber) 8%, var(--token-panel));
+ box-shadow: 0 14px 36px color-mix(in srgb, #000 36%, transparent);
+ animation: coshApprovalIn 560ms 160ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.checkpointDiffCard > header,
+.checkpointDiffCard > p {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.checkpointDiffCard > header {
+ justify-content: space-between;
+ margin-bottom: 10px;
+ color: var(--site-amber);
+ font-size: 0.74rem;
+}
+
+.checkpointDiffCard > header b {
+ color: var(--token-muted);
+ font-size: 0.57rem;
+}
+
+.checkpointDiffCard > p {
+ margin: 0;
+ padding: 9px 0;
+ border-top: 1px solid var(--token-line);
+ font-size: 0.68rem;
+}
+
+.checkpointDiffCard > p span,
+.checkpointDiffCard > p b {
+ color: var(--site-amber);
+}
+
+.checkpointDiffCard > p b {
+ margin-left: auto;
+}
+
+.checkpointDiffCard > footer {
+ padding-top: 10px;
+ color: var(--token-muted);
+ font-size: 0.62rem;
+}
+
+.checkpointBranchScene > svg {
+ width: 100%;
+ height: 100%;
+}
+
+.checkpointBranchScene > svg path {
+ fill: none;
+ stroke: color-mix(in srgb, var(--site-cyan) 50%, var(--token-line));
+ stroke-width: 4;
+}
+
+.checkpointBranchScene > svg .checkpointOldBranch {
+ stroke: color-mix(in srgb, var(--token-muted) 36%, var(--token-line));
+}
+
+.checkpointBranchScene > svg .checkpointNewBranch {
+ stroke: var(--site-amber);
+ stroke-dasharray: 9 8;
+ filter: drop-shadow(0 0 6px color-mix(in srgb, var(--site-amber) 45%, transparent));
+ animation: sightPathDrift 1.8s linear infinite;
+}
+
+.checkpointBranchNode {
+ position: absolute;
+ min-width: 88px;
+ padding: 8px 10px;
+ border: 1px solid var(--token-line);
+ background: var(--token-panel-strong);
+ color: var(--token-ink);
+ font-size: 0.72rem;
+ text-align: center;
+ transform: translate(-50%, -50%);
+}
+
+.checkpointBranchNode small {
+ display: block;
+ margin-top: 4px;
+ color: var(--token-muted);
+ font-size: 0.58rem;
+}
+
+.checkpointBranchNode--base { top: 51%; left: 8%; }
+.checkpointBranchNode--turn1 { top: 51%; left: 39%; }
+.checkpointBranchNode--old { top: 22%; right: -1%; opacity: 0.6; }
+.checkpointBranchNode--new {
+ right: -1%;
+ bottom: 8%;
+ border-color: var(--site-amber);
+ color: var(--site-amber);
+ box-shadow: 0 0 20px color-mix(in srgb, var(--site-amber) 22%, transparent);
+}
+
+.checkpointBranchScene > p {
+ position: absolute;
+ bottom: 2%;
+ left: 3%;
+ max-width: 54%;
+ margin: 0;
+ color: var(--token-ink);
+ font-size: 0.76rem;
+ line-height: 1.5;
+}
+
+@keyframes checkpointAutoSave {
+ from { opacity: 0; transform: translateY(12px) scale(0.8); }
+ to { opacity: 1; transform: translateY(0) scale(1); }
+}
+.skillFsCanvas {
+ display: grid;
+ grid-template-columns: 226px minmax(0, 1fr);
+ gap: 22px;
+ background:
+ radial-gradient(circle at 68% 46%, color-mix(in srgb, var(--site-cyan) 13%, transparent), transparent 35%),
+ color-mix(in srgb, var(--token-bg) 35%, transparent);
+}
+
+.skillStage {
+ position: relative;
+ min-width: 0;
+ min-height: 326px;
+ overflow: hidden;
+ background:
+ radial-gradient(circle at 54% 45%, color-mix(in srgb, var(--site-cyan) 8%, transparent), transparent 48%),
+ linear-gradient(180deg, color-mix(in srgb, var(--token-panel) 55%, transparent), transparent);
+ animation: capabilitySceneIn 420ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.skillUniverse,
+.skillDiscoverScene,
+.skillTransformScene,
+.skillActivationScene {
+ position: absolute;
+ inset: 42px 12px 10px;
+ overflow: hidden;
+}
+
+.skillUniverse > header {
+ position: absolute;
+ z-index: 4;
+ top: 3px;
+ right: 5px;
+ left: 5px;
+ display: flex;
+ justify-content: space-between;
+ color: var(--token-muted);
+ font-size: 0.68rem;
+}
+
+.skillUniverse > header b {
+ color: var(--site-cyan);
+}
+
+.skillCloud {
+ position: absolute;
+ inset: 35px 3% 5px;
+}
+
+.skillCloud span {
+ position: absolute;
+ padding: 7px 10px;
+ border: 1px solid color-mix(in srgb, var(--token-muted) 24%, transparent);
+ background: color-mix(in srgb, var(--token-panel) 72%, transparent);
+ color: var(--token-muted);
+ font-size: 0.64rem;
+ opacity: 0.42;
+ filter: blur(0.35px);
+ animation: skillCloudFloat 4s ease-in-out infinite;
+}
+
+.skillCloud span:nth-child(1) { top: 4%; left: 3%; }
+.skillCloud span:nth-child(2) { top: 34%; left: 0; animation-delay: -0.6s; }
+.skillCloud span:nth-child(3) { bottom: 4%; left: 8%; animation-delay: -1.3s; }
+.skillCloud span:nth-child(4) { top: 8%; left: 35%; }
+.skillCloud span:nth-child(5) { top: 36%; left: 31%; animation-delay: -2s; }
+.skillCloud span:nth-child(6) { bottom: 8%; left: 38%; animation-delay: -0.9s; }
+.skillCloud span:nth-child(7) { top: 2%; right: 30%; animation-delay: -1.8s; }
+.skillCloud span:nth-child(8) { bottom: 4%; right: 32%; animation-delay: -2.6s; }
+.skillCloud span:nth-child(9) { top: 12%; right: 5%; }
+.skillCloud span:nth-child(10) { top: 44%; right: 0; animation-delay: -1.2s; }
+.skillCloud span:nth-child(11) { bottom: 5%; right: 8%; animation-delay: -2.1s; }
+.skillCloud span:nth-child(12) { top: 59%; left: 19%; animation-delay: -3s; }
+
+.skillViewLens {
+ position: absolute;
+ z-index: 2;
+ top: 34px;
+ bottom: 8px;
+ left: 23%;
+ width: 56%;
+ display: grid;
+ grid-template-columns: 1fr auto;
+ align-content: center;
+ gap: 8px 16px;
+ padding: 20px 24px;
+ border: 1px solid color-mix(in srgb, var(--site-cyan) 62%, var(--token-line));
+ border-radius: 24px;
+ background:
+ linear-gradient(135deg, color-mix(in srgb, var(--site-cyan) 15%, transparent), color-mix(in srgb, var(--token-panel-strong) 88%, transparent));
+ box-shadow:
+ inset 0 0 50px color-mix(in srgb, var(--site-cyan) 6%, transparent),
+ 0 20px 60px color-mix(in srgb, #000 45%, transparent);
+ backdrop-filter: blur(8px);
+ animation: skillLensSettle 700ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.skillViewLens > header {
+ grid-column: 1 / -1;
+ display: flex;
+ justify-content: space-between;
+ color: var(--site-cyan);
+ font-size: 0.68rem;
+}
+
+.skillVisibilityMetric {
+ display: flex;
+ align-items: center;
+ gap: 9px;
+}
+
+.skillVisibilityMetric strong {
+ color: var(--site-cyan);
+ font-size: 3rem;
+ line-height: 1;
+ text-shadow: 0 0 24px color-mix(in srgb, var(--site-cyan) 42%, transparent);
+}
+
+.skillVisibilityMetric span {
+ color: var(--token-muted);
+ font-size: 0.65rem;
+ line-height: 1.35;
+}
+
+.skillViewLens > p {
+ max-width: 210px;
+ margin: 0;
+ color: var(--token-ink);
+ font-size: 0.84rem;
+ font-weight: 700;
+ line-height: 1.45;
+}
+
+.skillVisibleSet {
+ grid-column: 1 / -1;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+}
+
+.skillVisibleSet span {
+ padding: 7px 9px;
+ border: 1px solid color-mix(in srgb, var(--site-cyan) 55%, var(--token-line));
+ background: color-mix(in srgb, var(--site-cyan) 10%, transparent);
+ color: var(--token-ink);
+ font-size: 0.68rem;
+ animation: tokenLineIn 520ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.skillVisibleSet span:nth-child(2) { animation-delay: 100ms; }
+.skillVisibleSet span:nth-child(3) { animation-delay: 200ms; }
+.skillVisibleSet span:nth-child(4) { animation-delay: 300ms; }
+
+.skillDiscoverScene {
+ display: grid;
+ grid-template-columns: minmax(150px, 0.65fr) minmax(185px, 0.85fr) minmax(175px, 0.8fr);
+ align-items: center;
+ gap: 14px;
+}
+
+.skillCurrentShelf,
+.skillDiscoverDrawer--large,
+.skillDiscoverPreview {
+ min-width: 0;
+ padding: 14px;
+ border: 1px solid var(--token-line);
+ background: color-mix(in srgb, var(--token-panel) 82%, transparent);
+}
+
+.skillCurrentShelf > header {
+ display: grid;
+ gap: 4px;
+ margin-bottom: 7px;
+ color: var(--site-cyan);
+ font-size: 0.68rem;
+}
+
+.skillCurrentShelf > p {
+ margin: 0;
+ padding: 7px 0;
+ border-top: 1px solid var(--token-line);
+ color: var(--token-ink);
+ font-size: 0.67rem;
+}
+
+.skillDiscoverDrawer--large {
+ position: static;
+ width: auto;
+ border-color: color-mix(in srgb, var(--site-amber) 52%, var(--token-line));
+ box-shadow: 0 16px 40px color-mix(in srgb, #000 36%, transparent);
+ animation: skillDrawerIn 620ms 120ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.skillDiscoverDrawer--large > header,
+.skillDiscoverDrawer--large > p {
+ display: flex;
+ justify-content: space-between;
+ gap: 8px;
+}
+
+.skillDiscoverDrawer--large > header {
+ margin-bottom: 8px;
+ color: var(--site-amber);
+ font-size: 0.73rem;
+}
+
+.skillDiscoverDrawer--large > p {
+ margin: 0;
+ padding: 8px 0;
+ border-top: 1px solid var(--token-line);
+ color: var(--token-ink);
+ font-size: 0.67rem;
+}
+
+.skillDiscoverDrawer--large > p span,
+.skillDiscoverDrawer--large > small {
+ color: var(--token-muted);
+ font-size: 0.59rem;
+}
+
+.skillDiscoverDrawer--large > small {
+ display: block;
+ padding-top: 8px;
+ line-height: 1.45;
+}
+
+.skillDiscoverPreview {
+ display: grid;
+ gap: 8px;
+ border-color: color-mix(in srgb, var(--site-cyan) 48%, var(--token-line));
+ animation: coshApprovalIn 620ms 320ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.skillDiscoverPreview > span {
+ color: var(--site-cyan);
+ font-size: 0.62rem;
+}
+
+.skillDiscoverPreview strong {
+ overflow: hidden;
+ color: var(--token-ink);
+ font-size: 0.76rem;
+ text-overflow: ellipsis;
+}
+
+.skillDiscoverPreview small {
+ color: var(--token-muted);
+ font-size: 0.62rem;
+ line-height: 1.5;
+}
+
+.skillTransformScene {
+ display: grid;
+ grid-template-columns: minmax(180px, 1fr) 90px minmax(180px, 1fr);
+ align-items: center;
+ gap: 16px;
+}
+
+.skillTransformScene > article {
+ min-height: 180px;
+ display: grid;
+ align-content: center;
+ gap: 8px;
+ padding: 16px;
+ border: 1px solid var(--token-line);
+ background: color-mix(in srgb, var(--token-panel) 82%, transparent);
+}
+
+.skillTransformScene > article.is-result {
+ border-color: color-mix(in srgb, var(--site-cyan) 56%, var(--token-line));
+ box-shadow: 0 0 28px color-mix(in srgb, var(--site-cyan) 10%, transparent);
+ animation: coshApprovalIn 620ms 300ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.skillTransformScene article > span {
+ color: var(--site-cyan);
+ font-size: 0.63rem;
+}
+
+.skillTransformScene article > strong {
+ color: var(--token-ink);
+ font-size: 0.76rem;
+}
+
+.skillTransformScene article > code {
+ padding: 10px;
+ border: 0;
+ background: color-mix(in srgb, var(--token-bg) 58%, transparent);
+ color: var(--token-muted);
+ font-size: 0.64rem;
+ line-height: 1.6;
+}
+
+.skillTransformScene article > code mark {
+ padding: 1px 3px;
+ border-radius: 3px;
+ background: color-mix(in srgb, var(--site-amber) 18%, transparent);
+ color: var(--site-amber);
+ box-shadow: 0 0 12px color-mix(in srgb, var(--site-amber) 10%, transparent);
+}
+
+.skillTransformScene > article.is-result code mark {
+ background: color-mix(in srgb, var(--site-cyan) 18%, transparent);
+ color: var(--site-cyan);
+ box-shadow: 0 0 12px color-mix(in srgb, var(--site-cyan) 12%, transparent);
+}
+
+.skillTransformScene article > small {
+ color: var(--token-muted);
+ font-size: 0.59rem;
+}
+
+.skillReadLens {
+ display: grid;
+ place-items: center;
+ gap: 5px;
+ color: var(--site-amber);
+ text-align: center;
+}
+
+.skillReadLens > span {
+ width: 52px;
+ height: 52px;
+ display: grid;
+ place-items: center;
+ border: 2px solid var(--site-amber);
+ border-radius: 50%;
+ box-shadow: 0 0 20px color-mix(in srgb, var(--site-amber) 25%, transparent);
+ font-size: 1.4rem;
+ animation: checkpointHeadPulse 1.4s ease-in-out infinite;
+}
+
+.skillReadLens strong {
+ font-size: 0.65rem;
+}
+
+.skillReadLens small {
+ color: var(--token-muted);
+ font-size: 0.56rem;
+}
+
+.skillTransformScene > p,
+.skillActivationScene > p {
+ position: absolute;
+ right: 4%;
+ bottom: 1%;
+ left: 4%;
+ margin: 0;
+ color: var(--token-muted);
+ font-size: 0.64rem;
+ text-align: center;
+}
+
+.skillActivationScene {
+ display: grid;
+ align-content: center;
+ gap: 15px;
+ padding: 0 6%;
+}
+
+.skillActivationScene > header {
+ display: flex;
+ justify-content: space-between;
+ color: var(--token-muted);
+ font-size: 0.65rem;
+}
+
+.skillActivationScene > header b {
+ color: var(--site-cyan);
+}
+
+.skillActivationChoices {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 9px;
+}
+
+.skillActivationChoices > span {
+ display: grid;
+ place-items: center;
+ gap: 5px;
+ padding: 14px 10px;
+ border: 1px solid var(--token-line);
+ background: color-mix(in srgb, var(--token-panel) 76%, transparent);
+ color: var(--token-muted);
+ text-align: center;
+}
+
+.skillActivationChoices i {
+ font-size: 1.2rem;
+ font-style: normal;
+}
+
+.skillActivationChoices b {
+ color: var(--token-ink);
+ font-size: 0.74rem;
+}
+
+.skillActivationChoices small {
+ font-size: 0.59rem;
+}
+
+.skillActivationChoices > span.is-fallback {
+ border-color: var(--site-amber);
+ background: color-mix(in srgb, var(--site-amber) 10%, transparent);
+ color: var(--site-amber);
+ box-shadow: 0 0 24px color-mix(in srgb, var(--site-amber) 18%, transparent);
+}
+
+.skillActivationResult {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ padding: 12px 14px;
+ border: 1px solid color-mix(in srgb, var(--site-amber) 50%, var(--token-line));
+ background: color-mix(in srgb, var(--site-amber) 7%, transparent);
+ animation: coshApprovalIn 620ms 260ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.skillActivationResult > span {
+ color: var(--token-ink);
+ font-size: 0.72rem;
+}
+
+.skillActivationResult > strong {
+ padding: 3px 8px;
+ background: var(--site-amber);
+ color: var(--token-bg);
+ font-size: 0.62rem;
+}
+
+.skillActivationResult > small {
+ margin-left: auto;
+ color: var(--token-muted);
+ font-size: 0.61rem;
+}
+.securityCanvas {
+ display: grid;
+ grid-template-columns: 226px minmax(0, 1fr);
+ gap: 22px;
+ background:
+ radial-gradient(circle at 68% 46%, color-mix(in srgb, var(--site-amber) 14%, transparent), transparent 35%),
+ color-mix(in srgb, var(--token-bg) 38%, transparent);
+}
+
+.securityStage {
+ position: relative;
+ min-width: 0;
+ min-height: 326px;
+ overflow: hidden;
+ background:
+ radial-gradient(circle at 54% 45%, color-mix(in srgb, var(--site-amber) 8%, transparent), transparent 48%),
+ linear-gradient(180deg, color-mix(in srgb, var(--token-panel) 55%, transparent), transparent);
+ animation: capabilitySceneIn 420ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.securitySandboxScene,
+.securityLedgerScene,
+.securityScannerScene,
+.securityHardeningScene {
+ position: absolute;
+ inset: 42px 12px 10px;
+}
+
+.securitySandboxScene {
+ display: grid;
+ grid-template-rows: auto minmax(0, 1fr);
+ gap: 7px;
+}
+
+.securityCommandPicker {
+ display: flex;
+ justify-content: center;
+ gap: 7px;
+}
+
+.securityCommandPicker button {
+ min-width: 142px;
+ display: grid;
+ gap: 2px;
+ padding: 6px 9px;
+ border: 1px solid var(--token-line);
+ background: color-mix(in srgb, var(--token-panel) 72%, transparent);
+ color: var(--token-muted);
+ cursor: pointer;
+ font-family: var(--ifm-font-family-monospace);
+ text-align: left;
+}
+
+.securityCommandPicker button:hover,
+.securityCommandPicker button.is-active {
+ border-color: color-mix(in srgb, var(--site-amber) 58%, var(--token-line));
+ background: color-mix(in srgb, var(--site-amber) 9%, transparent);
+ color: var(--token-ink);
+}
+
+.securityCommandPicker button:focus-visible {
+ outline: 2px solid var(--site-amber);
+ outline-offset: 2px;
+}
+
+.securityCommandPicker code {
+ overflow: hidden;
+ padding: 0;
+ border: 0;
+ background: transparent;
+ color: inherit;
+ font-size: 0.64rem;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.securityCommandPicker span {
+ color: var(--token-muted);
+ font-size: 0.54rem;
+}
+
+.permissionField {
+ position: relative;
+ min-height: 0;
+ overflow: hidden;
+ background:
+ radial-gradient(circle at 50% 50%, color-mix(in srgb, var(--site-amber) 9%, transparent), transparent 42%),
+ linear-gradient(180deg, color-mix(in srgb, var(--token-panel) 42%, transparent), transparent);
+ animation: capabilitySceneIn 420ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.permissionOuterAsset {
+ position: absolute;
+ display: grid;
+ place-items: center;
+ gap: 3px;
+ color: var(--token-muted);
+ font-size: 0.57rem;
+ opacity: 0.58;
+}
+
+.permissionOuterAsset > span {
+ width: 30px;
+ height: 30px;
+ display: grid;
+ place-items: center;
+ border: 1px solid var(--token-line);
+ border-radius: 50%;
+ background: var(--token-panel);
+ filter: grayscale(1);
+}
+
+.permissionOuterAsset--etc { top: 12%; left: 4%; }
+.permissionOuterAsset--ssh { right: 4%; bottom: 12%; }
+.permissionOuterAsset--network { top: 12%; right: 7%; }
+
+.permissionMembrane {
+ position: absolute;
+ top: 7%;
+ bottom: 7%;
+ left: 50%;
+ width: min(58%, 460px);
+ display: grid;
+ align-content: center;
+ gap: 7px;
+ padding: 12px 18px;
+ border: 2px solid color-mix(in srgb, var(--site-amber) 72%, var(--token-line));
+ border-radius: 44% 56% 48% 52% / 52% 42% 58% 48%;
+ background: color-mix(in srgb, var(--site-amber) 8%, var(--token-panel));
+ box-shadow:
+ inset 0 0 48px color-mix(in srgb, var(--site-amber) 8%, transparent),
+ 0 0 38px color-mix(in srgb, var(--site-amber) 12%, transparent);
+ transform: translateX(-50%);
+ animation: permissionMembraneSet 680ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.permissionField--read .permissionMembrane {
+ width: min(46%, 370px);
+ border-color: color-mix(in srgb, var(--site-cyan) 68%, var(--token-line));
+ background: color-mix(in srgb, var(--site-cyan) 7%, var(--token-panel));
+}
+
+.permissionField--deny .permissionMembrane {
+ width: min(42%, 340px);
+ border-color: #ef6b63;
+ background: color-mix(in srgb, #ef6b63 8%, var(--token-panel));
+}
+
+.permissionMembrane > header {
+ display: flex;
+ align-items: center;
+ gap: 7px;
+ color: var(--site-amber);
+ font-size: 0.64rem;
+}
+
+.permissionField--read .permissionMembrane > header {
+ color: var(--site-cyan);
+}
+
+.permissionMembrane > header b {
+ margin-left: auto;
+ color: var(--token-muted);
+ font-size: 0.53rem;
+}
+
+.permissionMembrane > code {
+ overflow: hidden;
+ padding: 6px 8px;
+ border: 0;
+ background: color-mix(in srgb, var(--token-bg) 65%, transparent);
+ color: var(--token-ink);
+ font-size: 0.69rem;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.permissionWorkspace {
+ display: grid;
+ grid-template-columns: 1fr 0.64fr 0.64fr;
+ gap: 6px;
+}
+
+.permissionArea {
+ min-height: 42px;
+ display: grid;
+ align-content: center;
+ gap: 3px;
+ padding: 6px;
+ border: 1px solid var(--token-line);
+ background: color-mix(in srgb, var(--token-bg) 42%, transparent);
+}
+
+.permissionArea b {
+ color: var(--token-ink);
+ font-size: 0.62rem;
+}
+
+.permissionArea small {
+ color: var(--token-muted);
+ font-size: 0.51rem;
+}
+
+.permissionField--write .permissionArea--workspace,
+.permissionField--write .permissionArea--tmp {
+ border-color: color-mix(in srgb, var(--site-amber) 56%, var(--token-line));
+ background: color-mix(in srgb, var(--site-amber) 12%, transparent);
+}
+
+.permissionField--write .permissionArea--workspace small,
+.permissionField--write .permissionArea--tmp small {
+ color: var(--site-amber);
+}
+
+.permissionDenied {
+ position: absolute;
+ inset: 0;
+ display: grid;
+ place-items: center;
+ align-content: center;
+ gap: 4px;
+ border-radius: inherit;
+ background: color-mix(in srgb, var(--token-bg) 75%, transparent);
+ color: #ff8a80;
+ backdrop-filter: blur(3px);
+ animation: permissionDenyStamp 420ms 180ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.permissionDenied span {
+ width: 56px;
+ height: 56px;
+ display: grid;
+ place-items: center;
+ border: 3px solid #ef6b63;
+ border-radius: 50%;
+ font-size: 2.3rem;
+}
+
+.permissionDenied strong {
+ font-size: 0.86rem;
+ letter-spacing: 0.1em;
+}
+
+.permissionHeadline {
+ position: absolute;
+ top: 50%;
+ left: 2%;
+ width: 155px;
+ display: grid;
+ gap: 5px;
+ transform: translateY(-50%);
+}
+
+.permissionHeadline strong {
+ color: var(--site-amber);
+ font-size: 0.92rem;
+ line-height: 1.2;
+}
+
+.permissionField--read .permissionHeadline strong { color: var(--site-cyan); }
+.permissionField--deny .permissionHeadline strong { color: #ff8a80; }
+
+.permissionHeadline span {
+ color: var(--token-muted);
+ font-size: 0.59rem;
+ line-height: 1.45;
+}
+
+.securityLedgerScene {
+ display: grid;
+ grid-template-columns: minmax(190px, 1fr) 120px minmax(200px, 1fr);
+ align-items: center;
+ gap: 18px;
+}
+
+.securityManifest,
+.securityDriftResult {
+ padding: 15px;
+ border: 1px solid var(--token-line);
+ background: color-mix(in srgb, var(--token-panel) 82%, transparent);
+}
+
+.securityManifest > header {
+ display: flex;
+ gap: 8px;
+ margin-bottom: 10px;
+ color: var(--site-cyan);
+ font-size: 0.72rem;
+}
+
+.securityManifest > p {
+ display: grid;
+ gap: 4px;
+ margin: 0;
+ padding: 8px 0;
+ border-top: 1px solid var(--token-line);
+ font-size: 0.65rem;
+}
+
+.securityManifest > p b {
+ color: var(--token-muted);
+ font-size: 0.55rem;
+}
+
+.securityLedgerChain {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.securityLedgerChain span {
+ width: 34px;
+ height: 34px;
+ display: grid;
+ place-items: center;
+ border: 2px solid var(--site-cyan);
+ border-radius: 50%;
+ color: var(--site-cyan);
+ font-size: 0.65rem;
+}
+
+.securityLedgerChain i {
+ width: 16px;
+ height: 2px;
+ background: var(--site-cyan);
+}
+
+.securityLedgerChain span.is-drifted {
+ border-color: #ef6b63;
+ color: #ef6b63;
+ box-shadow: 0 0 16px color-mix(in srgb, #ef6b63 35%, transparent);
+}
+
+.securityDriftResult {
+ border-color: color-mix(in srgb, #ef6b63 58%, var(--token-line));
+ animation: coshApprovalIn 620ms 220ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.securityDriftResult > span {
+ color: #ef6b63;
+ font-size: 1.5rem;
+}
+
+.securityDriftResult > strong {
+ margin-left: 8px;
+ color: #ff8a80;
+ font-size: 0.86rem;
+}
+
+.securityDriftResult > p {
+ display: flex;
+ justify-content: space-between;
+ gap: 8px;
+ margin: 8px 0 0;
+ padding-top: 8px;
+ border-top: 1px solid var(--token-line);
+ color: var(--token-muted);
+ font-size: 0.62rem;
+}
+
+.securityDriftResult > small {
+ display: block;
+ margin-top: 10px;
+ color: var(--token-muted);
+ font-size: 0.59rem;
+ line-height: 1.45;
+}
+
+.securityScannerScene {
+ display: grid;
+ grid-template-columns: minmax(280px, 1.4fr) minmax(185px, 0.8fr);
+ align-items: center;
+ gap: 22px;
+ padding: 0 4%;
+}
+
+.securityScannerScene > article {
+ position: relative;
+ overflow: hidden;
+ padding: 15px;
+ border: 1px solid var(--token-line);
+ background: color-mix(in srgb, var(--token-panel) 84%, transparent);
+}
+
+.securityScannerScene article > header {
+ display: flex;
+ gap: 8px;
+ color: var(--site-cyan);
+ font-size: 0.7rem;
+}
+
+.securityScannerScene article > header b {
+ margin-left: auto;
+ color: var(--token-muted);
+ font-size: 0.56rem;
+}
+
+.securityScannerScene article > code {
+ display: block;
+ margin: 22px 0;
+ padding: 14px;
+ border: 0;
+ background: color-mix(in srgb, var(--token-bg) 62%, transparent);
+ color: var(--token-ink);
+ font-size: 0.74rem;
+}
+
+.securityScannerScene mark {
+ background: color-mix(in srgb, #ef6b63 28%, transparent);
+ color: #ff9a91;
+}
+
+.securityScanBeam {
+ position: absolute;
+ right: 0;
+ left: 0;
+ height: 2px;
+ background: var(--site-amber);
+ box-shadow: 0 0 12px var(--site-amber);
+ animation: securityScanMove 2.2s ease-in-out infinite;
+}
+
+.securityScannerScene article > footer {
+ display: flex;
+ gap: 6px;
+}
+
+.securityScannerScene article > footer span {
+ padding: 3px 6px;
+ border: 1px solid var(--token-line);
+ color: var(--token-muted);
+ font-size: 0.55rem;
+}
+
+.securityVerdict {
+ padding: 18px;
+ border: 1px solid color-mix(in srgb, var(--site-amber) 58%, var(--token-line));
+ background: color-mix(in srgb, var(--site-amber) 9%, var(--token-panel));
+ animation: coshApprovalIn 620ms 240ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.securityVerdict > span {
+ color: var(--site-amber);
+ font-size: 1.5rem;
+}
+
+.securityVerdict > strong {
+ margin-left: 8px;
+ color: var(--site-amber);
+ font-size: 1rem;
+}
+
+.securityVerdict > p {
+ color: var(--token-ink);
+ font-size: 0.7rem;
+ line-height: 1.5;
+}
+
+.securityVerdict > small {
+ color: var(--token-muted);
+ font-size: 0.61rem;
+ line-height: 1.5;
+}
+
+.securityScannerScene > p {
+ position: absolute;
+ right: 4%;
+ bottom: 1%;
+ left: 4%;
+ margin: 0;
+ color: var(--token-muted);
+ font-size: 0.61rem;
+ text-align: center;
+}
+
+.securityHardeningScene {
+ display: grid;
+ grid-template-columns: 170px minmax(230px, 1fr) minmax(180px, 0.8fr);
+ align-items: center;
+ gap: 18px;
+ padding: 0 3%;
+}
+
+.securityHostScore {
+ display: grid;
+ place-items: center;
+ color: var(--token-muted);
+ text-align: center;
+}
+
+.securityHostScore > span {
+ width: 112px;
+ height: 112px;
+ display: grid;
+ place-items: center;
+ border: 9px solid color-mix(in srgb, var(--site-cyan) 25%, var(--token-line));
+ border-top-color: var(--site-cyan);
+ border-right-color: var(--site-cyan);
+ border-radius: 50%;
+ color: var(--site-cyan);
+ font-size: 2.2rem;
+ box-shadow: 0 0 28px color-mix(in srgb, var(--site-cyan) 16%, transparent);
+ animation: securityScoreSpin 900ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.securityHostScore > strong {
+ margin-top: -42px;
+ font-size: 0.62rem;
+}
+
+.securityHostScore > small {
+ margin-top: 31px;
+ font-size: 0.61rem;
+}
+
+.securityBaselineChecks {
+ display: grid;
+ gap: 7px;
+}
+
+.securityBaselineChecks > p {
+ display: grid;
+ grid-template-columns: 24px 1fr auto;
+ align-items: center;
+ gap: 8px;
+ margin: 0;
+ padding: 10px;
+ border: 1px solid var(--token-line);
+ background: color-mix(in srgb, var(--token-panel) 75%, transparent);
+ font-size: 0.65rem;
+}
+
+.securityBaselineChecks > p span {
+ color: var(--site-cyan);
+}
+
+.securityBaselineChecks > p small {
+ color: var(--token-muted);
+ font-size: 0.57rem;
+}
+
+.securityBaselineChecks > p.is-warning {
+ border-color: color-mix(in srgb, var(--site-amber) 48%, var(--token-line));
+}
+
+.securityBaselineChecks > p.is-warning span,
+.securityBaselineChecks > p.is-warning small {
+ color: var(--site-amber);
+}
+
+.securityDryRun {
+ display: grid;
+ gap: 9px;
+ padding: 18px;
+ border: 1px solid color-mix(in srgb, var(--site-amber) 56%, var(--token-line));
+ background: color-mix(in srgb, var(--site-amber) 8%, var(--token-panel));
+ animation: coshApprovalIn 620ms 240ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.securityDryRun > span {
+ color: var(--site-amber);
+ font-size: 0.64rem;
+}
+
+.securityDryRun > strong {
+ color: var(--token-ink);
+ font-size: 1.05rem;
+}
+
+.securityDryRun > small {
+ color: var(--token-muted);
+ font-size: 0.61rem;
+ line-height: 1.5;
+}
+
+@keyframes securityScanMove {
+ 0%, 100% { top: 24%; opacity: 0; }
+ 20%, 80% { opacity: 1; }
+ 50% { top: 76%; }
+}
+
+@keyframes securityScoreSpin {
+ from { opacity: 0; transform: rotate(-90deg) scale(0.8); }
+ to { opacity: 1; transform: rotate(0) scale(1); }
+}
+
+@keyframes permissionMembraneSet {
+ from { opacity: 0; transform: translateX(-50%) scale(1.12); }
+ to { opacity: 1; transform: translateX(-50%) scale(1); }
+}
+
+@keyframes permissionDenyStamp {
+ from { opacity: 0; transform: scale(1.28); }
+ to { opacity: 1; transform: scale(1); }
+}
+.tokenPipeline {
+ flex: 1;
+ display: grid;
+ grid-template-columns: minmax(0, 1fr) 96px minmax(0, 1fr);
+ gap: 12px;
+ padding: 16px;
+ opacity: 1;
+ filter: blur(0);
+ transform: translateY(0);
+ transition:
+ opacity 180ms ease,
+ filter 180ms ease,
+ transform 420ms cubic-bezier(0.16, 1, 0.3, 1);
+}
+
+.tokenPipeline--leaving {
+ opacity: 0;
+ filter: blur(2px);
+ transform: translateY(8px);
+}
+
+.tokenCodeCard {
+ min-width: 0;
+ overflow: hidden;
+ padding: 14px;
+ border: 1px solid color-mix(in srgb, var(--token-muted) 22%, transparent);
+ background: color-mix(in srgb, var(--token-panel) 82%, transparent);
+}
+
+.tokenCodeCard--optimized {
+ border-color: color-mix(in srgb, var(--token-signal) 44%, transparent);
+ background: linear-gradient(
+ 145deg,
+ color-mix(in srgb, var(--token-signal) 13%, var(--token-panel)),
+ color-mix(in srgb, var(--token-panel) 82%, transparent)
+ );
+ animation: tokenPanelGlow 850ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.tokenCodeCard > header {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: space-between;
+ gap: 8px;
+ margin-bottom: 13px;
+ color: var(--token-muted);
+ font: 0.56rem var(--ifm-font-family-monospace);
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+}
+
+.tokenCodeCard > header b {
+ color: var(--token-signal);
+ font-size: 0.55rem;
+}
+
+.tokenCodeCard > code {
+ display: grid;
+ align-content: start;
+ gap: 5px;
+ overflow: hidden;
+ padding: 0;
+ border: 0;
+ background: transparent;
+ color: inherit;
+ font: 0.66rem/1.5 var(--ifm-font-family-monospace);
+ white-space: pre;
+}
+
+.tokenCodeLine {
+ display: block;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ animation: tokenLineIn 460ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.tokenCodeLine--noise {
+ color: var(--token-muted);
+ opacity: 0.58;
+}
+
+.tokenCodeLine--keep,
+.tokenCodeLine--remove {
+ color: var(--token-keep);
+}
+
+.tokenCodeLine--meta,
+.tokenCodeLine--add {
+ color: var(--token-signal);
+}
+
+.tokenProcessor {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 8px;
+ color: var(--token-signal);
+}
+
+.tokenProcessor::before,
+.tokenProcessor::after {
+ position: absolute;
+ top: 50%;
+ width: 18px;
+ height: 1px;
+ background: linear-gradient(90deg, transparent 10%, var(--token-signal) 50%, transparent 90%);
+ background-size: 200% 100%;
+ content: '';
+ opacity: 0.55;
+ animation: tokenFlowLine 1.3s ease-in-out infinite;
+}
+
+.tokenProcessor::before {
+ right: calc(50% + 43px);
+}
+
+.tokenProcessor::after {
+ left: calc(50% + 43px);
+ transform: rotate(180deg);
+}
+
+.tokenProcessor > span {
+ width: 86px;
+ height: 44px;
+ display: grid;
+ place-items: center;
+ border: 1px solid var(--token-line);
+ border-radius: 999px;
+ background: var(--token-panel-strong);
+ box-shadow: 0 0 28px color-mix(in srgb, var(--token-signal) 20%, transparent);
+ font: 600 0.59rem var(--ifm-font-family-monospace);
+ letter-spacing: -0.02em;
+ animation: tokenCorePulse 950ms cubic-bezier(0.16, 1, 0.3, 1) both;
+}
+
+.tokenProcessor small {
+ font: 0.51rem var(--ifm-font-family-monospace);
+ letter-spacing: 0.09em;
+ text-transform: uppercase;
+}
+
+.tokenWorkbenchFooter {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 18px;
+ padding: 12px 16px;
+ border-top: 1px solid var(--token-line);
+}
+
+.tokenWorkbenchFooter p {
+ max-width: 640px;
+ margin: 0;
+ color: var(--token-muted);
+ font-size: 0.7rem;
+ line-height: 1.5;
+}
+
+.tokenWorkbenchFooter > div {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-end;
+ gap: 6px;
+}
+
+.tokenWorkbenchFooter > div span {
+ padding: 4px 8px;
+ border: 1px solid var(--token-line);
+ background: color-mix(in srgb, var(--token-signal) 7%, transparent);
+ color: var(--token-signal);
+ font: 0.52rem var(--ifm-font-family-monospace);
+ letter-spacing: 0.04em;
+ text-transform: uppercase;
+ white-space: nowrap;
+}
+
+.tokenFeatureRail {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.tokenRailGroup {
+ --rail-accent: var(--token-signal);
+ overflow: hidden;
+ border: 1px solid var(--token-line);
+ background: color-mix(in srgb, var(--token-panel) 88%, transparent);
+}
+
+.tokenRailGroup--cyan {
+ --rail-accent: var(--site-cyan);
+}
+
+.tokenRailGroup--lime {
+ --rail-accent: var(--site-lime);
+}
+
+.tokenRailGroup--amber {
+ --rail-accent: var(--site-amber);
+}
+
+.tokenRailGroup > header {
+ min-height: 42px;
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 8px 12px;
+ border-bottom: 1px solid var(--token-line);
+ color: var(--token-ink);
+}
+
+.tokenRailGroup > header > span {
+ width: 26px;
+ color: var(--rail-accent);
+ font: 600 0.83rem var(--ifm-font-family-monospace);
+ text-align: center;
+}
+
+.tokenRailGroup > header > strong {
+ font-size: 0.9rem;
+}
+
+.tokenRailGroup > div {
+ display: grid;
+}
+
+.tokenRailGroup button {
+ min-height: 58px;
+ display: grid;
+ grid-template-columns: 28px minmax(0, 1fr) 18px;
+ grid-template-rows: auto auto;
+ align-items: center;
+ gap: 9px;
+ padding: 8px 12px;
+ border: 0;
+ border-top: 1px solid color-mix(in srgb, var(--token-line) 72%, transparent);
+ background: transparent;
+ color: inherit;
+ cursor: pointer;
+ text-align: left;
+ transition:
+ background-color 220ms ease,
+ color 220ms ease,
+ box-shadow 220ms ease;
+}
+
+.tokenRailGroup button:first-child {
+ border-top: 0;
+}
+
+.tokenRailGroup button:hover {
+ background: color-mix(in srgb, var(--rail-accent) 10%, transparent);
+}
+
+.tokenRailGroup button.tokenRailItem--active {
+ min-height: 64px;
+ box-shadow: inset 3px 0 0 var(--rail-accent);
+ background: linear-gradient(
+ 100deg,
+ color-mix(in srgb, var(--rail-accent) 18%, var(--token-panel)),
+ color-mix(in srgb, var(--token-panel) 84%, transparent)
+ );
+ color: var(--token-ink);
+}
+
+.tokenRailItemIcon {
+ width: 28px;
+ height: 28px;
+ display: grid;
+ place-items: center;
+ color: currentColor;
+ font: 600 0.75rem var(--ifm-font-family-monospace);
+ grid-row: 1 / span 2;
+}
+
+.tokenRailGroup button.tokenRailItem--active .tokenRailItemIcon {
+ color: var(--rail-accent);
+}
+
+.tokenRailGroup button > strong {
+ min-width: 0;
+ grid-column: 2;
+ font-size: 0.74rem;
+ line-height: 1.35;
+}
+
+.tokenRailGroup button > small {
+ grid-column: 2;
+ color: var(--token-muted);
+ font-size: 0.58rem;
+ line-height: 1.4;
+}
+
+.tokenRailGroup button > b {
+ grid-column: 3;
+ grid-row: 1 / span 2;
+ color: var(--rail-accent);
+ font: 0.9rem var(--ifm-font-family-monospace);
+ text-align: right;
+}
+
+@keyframes coshApprovalIn {
+ from {
+ opacity: 0;
+ filter: blur(3px);
+ transform: translateX(-14px) scale(0.98);
+ }
+ to {
+ opacity: 1;
+ filter: blur(0);
+ transform: translateX(0) scale(1);
+ }
+}
+
+@keyframes sightInvocationTravel {
+ 0%,
+ 6% {
+ left: 7%;
+ opacity: 0;
+ }
+ 12% {
+ left: 8%;
+ opacity: 1;
+ }
+ 34% {
+ left: 32%;
+ }
+ 56% {
+ left: 56%;
+ }
+ 78% {
+ left: 80%;
+ }
+ 100% {
+ left: 91%;
+ opacity: 0;
+ }
+}
+
+@keyframes sightInvocationFocus {
+ 0%,
+ 100% {
+ box-shadow: 0 14px 34px color-mix(in srgb, var(--token-bg) 65%, transparent);
+ transform: translateY(0);
+ }
+ 12%,
+ 24% {
+ box-shadow:
+ 0 16px 36px color-mix(in srgb, var(--token-bg) 70%, transparent),
+ 0 0 22px color-mix(in srgb, var(--site-lime) 22%, transparent);
+ transform: translateY(-5px);
+ }
+}
+
+@keyframes sightRobotLoop {
+ 0%,
+ 100% {
+ top: 50%;
+ left: 0;
+ transform: translate(-50%, -50%);
+ }
+ 12.5% {
+ top: 15%;
+ left: 15%;
+ transform: translate(-50%, -50%);
+ }
+ 25% {
+ top: 0;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ }
+ 37.5% {
+ top: 15%;
+ left: 85%;
+ transform: translate(-50%, -50%);
+ }
+ 50% {
+ top: 50%;
+ left: 100%;
+ transform: translate(-50%, -50%);
+ }
+ 62.5% {
+ top: 85%;
+ left: 85%;
+ transform: translate(-50%, -50%);
+ }
+ 75% {
+ top: 100%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ }
+ 87.5% {
+ top: 85%;
+ left: 15%;
+ transform: translate(-50%, -50%);
+ }
+}
+
+@keyframes checkpointHeadPulse {
+ 0%,
+ 100% {
+ opacity: 0.75;
+ transform: scale(0.94);
+ }
+ 50% {
+ opacity: 1;
+ transform: scale(1.08);
+ }
+}
+
+@keyframes skillViewReveal {
+ from {
+ opacity: 0;
+ clip-path: inset(0 100% 0 0);
+ }
+ to {
+ opacity: 1;
+ clip-path: inset(0 0 0 0);
+ }
+}
+
+@keyframes riskScan {
+ 0% {
+ opacity: 0.45;
+ transform: scaleY(0.7);
+ }
+ 55% {
+ opacity: 1;
+ transform: scaleY(1.08);
+ }
+ 100% {
+ transform: scaleY(1);
+ }
+}
+
+@keyframes tokenLineIn {
+ from {
+ opacity: 0;
+ filter: blur(2px);
+ transform: translateY(8px);
+ }
+ to {
+ opacity: 1;
+ filter: blur(0);
+ transform: translateY(0);
+ }
+}
+
+@keyframes tokenCorePulse {
+ 0% {
+ opacity: 0.5;
+ transform: scale(0.92);
+ box-shadow: 0 0 0 color-mix(in srgb, var(--token-signal) 0%, transparent);
+ }
+ 45% {
+ opacity: 1;
+ transform: scale(1.03);
+ box-shadow: 0 0 36px color-mix(in srgb, var(--token-signal) 34%, transparent);
+ }
+ 100% {
+ transform: scale(1);
+ box-shadow: 0 0 28px color-mix(in srgb, var(--token-signal) 20%, transparent);
+ }
+}
+
+@keyframes tokenFlowLine {
+ from {
+ background-position: 100% 0;
+ }
+ to {
+ background-position: -100% 0;
+ }
+}
+
+@keyframes tokenPanelGlow {
+ from {
+ border-color: color-mix(in srgb, var(--token-muted) 18%, transparent);
+ }
+}
+
.scenarioSection {
min-height: calc(100vh - var(--ifm-navbar-height));
display: flex;
@@ -1352,6 +4568,10 @@ html[lang='zh-CN'] .agentEntryHero h1 {
.routeGrid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
+
+ .tokenFeatureLayout {
+ grid-template-columns: minmax(0, 1fr) 260px;
+ }
}
@media (min-width: 997px) {
@@ -1391,6 +4611,7 @@ html[lang='zh-CN'] .agentEntryHero h1 {
}
.heroSection,
+ .tokenFeatureSection,
.scenarioSection {
min-height: auto;
}
@@ -1403,6 +4624,15 @@ html[lang='zh-CN'] .agentEntryHero h1 {
max-width: 700px;
}
+ .tokenFeatureLayout {
+ grid-template-columns: 1fr;
+ }
+
+ .tokenFeatureRail {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ }
+
.scenarioGrid {
grid-template-columns: 1fr;
border-top: 0;
@@ -1490,6 +4720,358 @@ html[lang='zh-CN'] .agentEntryHero h1 {
display: grid;
}
+ .tokenFeatureInner {
+ padding-block: 64px;
+ }
+
+ .tokenFeatureHeading {
+ grid-template-columns: 1fr;
+ gap: 16px;
+ }
+
+ .tokenFeatureBenchmark {
+ text-align: left;
+ }
+
+ .tokenWorkbenchHeader {
+ align-items: flex-start;
+ flex-direction: column;
+ }
+
+ .tokenDemoTabs {
+ width: 100%;
+ overflow-x: auto;
+ }
+
+ .tokenDemoTab {
+ flex: 0 0 auto;
+ }
+
+ .tokenMetric {
+ justify-items: start;
+ }
+
+ .capabilityCanvas {
+ min-height: auto;
+ padding: 12px;
+ }
+
+ .coshCanvas,
+ .sightCanvas,
+ .checkpointCanvas,
+ .skillFsCanvas,
+ .securityCanvas {
+ grid-template-columns: 1fr;
+ }
+
+ .coshStage {
+ min-height: 620px;
+ }
+
+ .coshHandoffScene,
+ .coshInsightScene,
+ .coshHealthScene {
+ padding: 18px 16px 56px;
+ }
+
+ .coshPlanCard,
+ .coshTtyHandoff {
+ width: 100%;
+ }
+
+ .coshTtyHandoff > div {
+ grid-template-columns: auto 1fr;
+ }
+
+ .coshTtyHandoff > div b {
+ grid-column: 2;
+ }
+
+ .coshInsightScene,
+ .coshHealthScene {
+ grid-template-columns: 1fr;
+ }
+
+ .coshCommandRun {
+ grid-row: auto;
+ }
+
+ .coshHealthSuggestion {
+ grid-template-columns: 1fr;
+ }
+
+ .coshHealthSuggestion > small {
+ white-space: normal;
+ }
+
+ .coshSceneClaim {
+ right: 16px;
+ left: 16px;
+ }
+
+ .capabilityFeaturePicker {
+ grid-template-columns: 1fr;
+ }
+
+ .capabilityFeaturePicker button:hover,
+ .capabilityFeaturePicker button.is-active {
+ transform: none;
+ }
+
+ .sightStage,
+ .checkpointStage {
+ min-height: 360px;
+ }
+
+ .sightStage--trace {
+ min-height: 520px;
+ }
+
+ .sightStage--agents {
+ min-height: 620px;
+ }
+
+ .sightStage--issues {
+ min-height: 540px;
+ }
+
+ .sightInvocationFlow {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ align-content: center;
+ padding: 16px 4px 52px;
+ }
+
+ .sightInvocationFlow::before,
+ .sightInvocationRunner {
+ display: none;
+ }
+
+ .sightInvocationStep {
+ min-height: 136px;
+ }
+
+ .sightInvocationFlow > p,
+ .sightTopologyFlow > p {
+ font-size: 0.7rem;
+ }
+
+ .sightTopologyFlow {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ align-content: center;
+ padding: 16px 4px 58px;
+ }
+
+ .sightTopologyLink {
+ display: none;
+ }
+
+ .sightTopologyChildren {
+ grid-column: 1 / -1;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+
+ .sightTopologyChildren::before {
+ display: none;
+ }
+
+ .sightInterruptionLoop {
+ top: auto;
+ right: 4px;
+ bottom: 44px;
+ width: calc(100% - 8px);
+ height: 45%;
+ }
+
+ .checkpointStage--preview {
+ min-height: 560px;
+ }
+
+ .checkpointAutoScene {
+ grid-template-columns: repeat(2, 1fr);
+ padding-bottom: 62px;
+ }
+
+ .checkpointAutoLine {
+ display: none;
+ }
+
+ .checkpointAutoScene > p {
+ align-items: flex-start;
+ flex-direction: column;
+ gap: 4px;
+ }
+
+ .checkpointPreviewScene {
+ grid-template-columns: 1fr;
+ align-content: center;
+ gap: 10px;
+ }
+
+ .checkpointWorkspaceState {
+ padding: 12px;
+ }
+
+ .checkpointPreviewArrow {
+ grid-template-columns: auto 1fr;
+ }
+
+ .checkpointHistoryNode {
+ width: 68px;
+ }
+
+ .checkpointRollbackLabel strong {
+ font-size: 0.82rem;
+ }
+
+ .skillStage {
+ min-height: 440px;
+ }
+
+ .skillStage--discover,
+ .skillStage--transform {
+ min-height: 640px;
+ }
+
+ .skillViewLens {
+ top: 44px;
+ right: 3%;
+ bottom: 16px;
+ left: 3%;
+ width: auto;
+ }
+
+ .skillDiscoverScene,
+ .skillTransformScene {
+ grid-template-columns: 1fr;
+ align-content: center;
+ }
+
+ .skillTransformScene > article {
+ min-height: 145px;
+ }
+
+ .skillReadLens {
+ grid-template-columns: auto auto auto;
+ justify-content: center;
+ }
+
+ .skillActivationScene {
+ padding: 0;
+ }
+
+ .skillActivationChoices {
+ grid-template-columns: 1fr;
+ }
+
+ .skillActivationResult {
+ align-items: flex-start;
+ flex-direction: column;
+ }
+
+ .skillActivationResult > small {
+ margin-left: 0;
+ }
+
+ .securityStage {
+ min-height: 600px;
+ }
+
+ .securityStage--ledger,
+ .securityStage--hardening {
+ min-height: 680px;
+ }
+
+ .securityCommandPicker {
+ justify-content: flex-start;
+ overflow-x: auto;
+ }
+
+ .securityCommandPicker button {
+ flex: 0 0 145px;
+ }
+
+ .permissionField {
+ min-height: 430px;
+ }
+
+ .permissionMembrane,
+ .permissionField--read .permissionMembrane,
+ .permissionField--deny .permissionMembrane {
+ top: 28%;
+ bottom: 8%;
+ width: 88%;
+ }
+
+ .permissionHeadline {
+ top: 5%;
+ left: 5%;
+ width: 90%;
+ transform: none;
+ }
+
+ .permissionOuterAsset--etc { top: 18%; left: 4%; }
+ .permissionOuterAsset--network { top: 18%; right: 4%; }
+ .permissionOuterAsset--ssh { display: none; }
+
+ .permissionWorkspace {
+ grid-template-columns: 1fr 1fr;
+ }
+
+ .permissionArea--git {
+ grid-column: 1 / -1;
+ }
+
+ .securityLedgerScene,
+ .securityHardeningScene,
+ .securityScannerScene {
+ grid-template-columns: 1fr;
+ align-content: center;
+ padding: 0;
+ }
+
+ .securityLedgerChain {
+ transform: rotate(90deg);
+ }
+
+ .securityScannerScene > p {
+ position: static;
+ }
+
+ .securityHostScore {
+ min-height: 170px;
+ }
+
+ .tokenPipeline {
+ grid-template-columns: 1fr;
+ padding: 12px;
+ }
+
+ .tokenProcessor {
+ min-height: 64px;
+ }
+
+ .tokenProcessor::before,
+ .tokenProcessor::after {
+ display: none;
+ }
+
+ .tokenCodeCard > code {
+ font-size: 0.61rem;
+ }
+
+ .tokenWorkbenchFooter {
+ align-items: flex-start;
+ flex-direction: column;
+ }
+
+ .tokenWorkbenchFooter > div {
+ justify-content: flex-start;
+ }
+
+ .tokenFeatureRail {
+ grid-template-columns: 1fr;
+ }
+
.scenarioHeading {
display: grid;
}
@@ -1552,4 +5134,58 @@ html[lang='zh-CN'] .agentEntryHero h1 {
html:has(.homePage) {
scroll-snap-type: none;
}
+
+ .tokenCodeLine,
+ .tokenProcessor > span,
+ .tokenProcessor::before,
+ .tokenProcessor::after,
+ .tokenCodeCard--optimized,
+ .coshHandoffScene,
+ .coshInsightScene,
+ .coshHealthScene,
+ .coshPlanCard,
+ .coshTtyHandoff,
+ .coshPromptLine i,
+ .coshLoginPrompt strong i,
+ .coshInsightCard,
+ .coshDiagnosis,
+ .coshHealthCard,
+ .coshVitals span > i::after,
+ .coshHealthSuggestion,
+ .sightStageHeader i,
+ .sightInvocationStep,
+ .sightInvocationRunner,
+ .sightInterruptionLoop > span,
+ .sightTokenColumn,
+ .sightOutputCurve path,
+ .sightTopologyNode--test.is-active,
+ .featureStageHeader i,
+ .checkpointRollbackPath,
+ .checkpointAutoScene > div,
+ .checkpointPreviewArrow span,
+ .checkpointDiffCard,
+ .checkpointNewBranch,
+ .skillCloud span,
+ .skillViewLens,
+ .skillVisibleSet span,
+ .skillDiscoverDrawer,
+ .skillDiscoverPreview,
+ .skillTransformScene > article.is-result,
+ .skillReadLens > span,
+ .skillActivationResult,
+ .permissionMembrane,
+ .permissionDenied,
+ .securityDriftResult,
+ .securityScanBeam,
+ .securityVerdict,
+ .securityHostScore > span,
+ .securityDryRun {
+ animation: none;
+ }
+
+ .tokenFeatureHeading,
+ .capabilityVisualShell,
+ .tokenPipeline {
+ transition: none;
+ }
}
diff --git a/website/src/pages/index.tsx b/website/src/pages/index.tsx
index d9c887d49c..aa411142d2 100644
--- a/website/src/pages/index.tsx
+++ b/website/src/pages/index.tsx
@@ -3,6 +3,7 @@ import useBaseUrl from '@docusaurus/useBaseUrl';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import Layout from '@theme/Layout';
import ThemedImage from '@theme/ThemedImage';
+import {useEffect, useRef, useState, type CSSProperties, type KeyboardEvent} from 'react';
import CopyCommand from '../components/CopyCommand';
import SiteLink from '../components/SiteLink';
import {installCommand, type Locale} from '../../content.config';
@@ -60,30 +61,480 @@ const content = {
},
} as const;
+type LocalizedText = Record;
+type CodeTone = 'meta' | 'keep' | 'noise' | 'remove' | 'add';
+
+type CapabilityDemo = {
+ id: string;
+ icon: string;
+ name: LocalizedText;
+ metricLabel: LocalizedText;
+ metricValue: string;
+ sourceLabel: LocalizedText;
+ resultLabel: LocalizedText;
+ resultStatus: LocalizedText;
+ action: LocalizedText;
+ copy: LocalizedText;
+ stages: readonly string[];
+ raw: readonly {tone: CodeTone; text: string}[];
+ optimized: readonly {tone: CodeTone; text: string}[];
+};
+
+type CapabilityShowcase = {
+ id: string;
+ componentLabel: string;
+ accent: 'cyan' | 'lime' | 'amber';
+ processor: string;
+ eyebrow: LocalizedText;
+ title: LocalizedText;
+ intro: LocalizedText;
+ note: LocalizedText;
+ noteLink?: LocalizedText;
+ noteHref?: string;
+ views: readonly CapabilityDemo[];
+};
+
+const featureUiContent = {
+ en: {
+ railLabel: 'ANOLISA capability areas',
+ demoTabs: 'Capability examples',
+ activeStages: 'Active stages',
+ },
+ zh: {
+ railLabel: 'ANOLISA 能力分组',
+ demoTabs: '能力演示',
+ activeStages: '当前处理阶段',
+ },
+} as const;
+
+const tokenDemos = {
+ json: {
+ icon: '{}',
+ name: {en: 'JSON / API', zh: 'JSON / API'},
+ metricLabel: {en: 'Response compression', zh: 'Response 压缩'},
+ metricValue: '26–78%',
+ copy: {
+ en: 'When an array is long, Tokenless keeps its first 32 items and moves the rest to Stash. IDs and paths remain in the current context.',
+ zh: '数组过长时,Tokenless 保留前 32 项,并把其余内容存入 Stash。当前上下文仍会保留 ID 和 Path。',
+ },
+ stages: ['Response', 'TOON', 'Stash'],
+ raw: [
+ {tone: 'meta', text: '{ "tool": "search_code",'},
+ {tone: 'keep', text: ' "status": "ok",'},
+ {tone: 'noise', text: ' "debug": { "latency_ms": 14,'},
+ {tone: 'noise', text: ' "trace": "gw-84f19", "cache": "hit" },'},
+ {tone: 'meta', text: ' "results": ['},
+ {tone: 'keep', text: ' { "id": 0, "name": "item-0",'},
+ {tone: 'keep', text: ' "path": "src/module_0/file_0.rs" },'},
+ {tone: 'keep', text: ' { "id": 1, "name": "item-1", … },'},
+ {tone: 'noise', text: ' … 98 more result records …'},
+ {tone: 'meta', text: ' ],'},
+ {tone: 'keep', text: ' "request_id": "req-8f3a91" }'},
+ ],
+ optimized: [
+ {tone: 'meta', text: 'tool: search_code'},
+ {tone: 'keep', text: 'status: ok'},
+ {tone: 'meta', text: 'results[32]{id,name,path}:'},
+ {tone: 'keep', text: ' 0,item-0,src/module_0/file_0.rs'},
+ {tone: 'keep', text: ' 1,item-1,src/module_1/file_1.rs'},
+ {tone: 'noise', text: ' … 30 more retained rows …'},
+ {tone: 'meta', text: '<> · 68 retrievable'},
+ {tone: 'keep', text: 'request_id: req-8f3a91'},
+ ],
+ },
+ logs: {
+ icon: '>_',
+ name: {en: 'Build logs', zh: '构建日志'},
+ metricLabel: {en: 'Command output', zh: '命令输出'},
+ metricValue: '60–90%',
+ copy: {
+ en: 'Build progress and passing checks collapse. Warnings, failures, and nearby context remain.',
+ zh: '编译进度和已通过的项目会被收起,Warning、Failure 及其附近内容继续保留。',
+ },
+ stages: ['RTK rewrite', 'Errors kept', 'Bounded context'],
+ raw: [
+ {tone: 'noise', text: 'Compiling tokenless-schema v0.7.6'},
+ {tone: 'noise', text: 'Compiling tokenless-cli v0.7.6'},
+ {tone: 'keep', text: 'warning: unused import: `Duration`'},
+ {tone: 'noise', text: 'Running unittests src/lib.rs'},
+ {tone: 'noise', text: 'test response::empty_values ... ok'},
+ {tone: 'noise', text: 'test response::keeps_ids ... ok'},
+ {tone: 'keep', text: 'test response::retains_paths ... FAILED'},
+ {tone: 'keep', text: "thread 'response::retains_paths' panicked:"},
+ {tone: 'keep', text: 'assertion failed: retained >= expected'},
+ {tone: 'noise', text: 'note: run with RUST_BACKTRACE=1'},
+ {tone: 'keep', text: 'test result: FAILED. 95 passed; 1 failed'},
+ ],
+ optimized: [
+ {tone: 'meta', text: 'cargo test · 1 failure'},
+ {tone: 'keep', text: 'warning: unused import: `Duration`'},
+ {tone: 'keep', text: 'response::retains_paths ... FAILED'},
+ {tone: 'keep', text: "thread 'response::retains_paths' panicked:"},
+ {tone: 'keep', text: 'assertion failed: retained >= expected'},
+ {tone: 'noise', text: 'context: RUST_BACKTRACE=1 available'},
+ {tone: 'meta', text: 'FAILED · 95 passed · 1 failed'},
+ ],
+ },
+ diff: {
+ icon: '±',
+ name: {en: 'Git diff', zh: 'Git Diff'},
+ metricLabel: {en: 'Command output', zh: '命令输出'},
+ metricValue: '60–90%',
+ copy: {
+ en: 'Changed lines keep the context needed to understand them. Large unchanged blocks stay out of the prompt.',
+ zh: '改动行和必要的上下文会被保留,大段未变化的内容不会进入 Prompt。',
+ },
+ stages: ['RTK rewrite', 'Changed lines', 'Bounded context'],
+ raw: [
+ {tone: 'meta', text: 'diff --git a/src/config.rs b/src/config.rs'},
+ {tone: 'noise', text: 'index 24d81ad..83af920 100644'},
+ {tone: 'meta', text: '@@ -42,9 +42,9 @@ impl Defaults {'},
+ {tone: 'noise', text: ' Self {'},
+ {tone: 'noise', text: ' compression: true,'},
+ {tone: 'remove', text: '- truncate_arrays_at: 16,'},
+ {tone: 'add', text: '+ truncate_arrays_at: 32,'},
+ {tone: 'noise', text: ' stash: true,'},
+ {tone: 'noise', text: ' stats: Stats::default(),'},
+ {tone: 'noise', text: ' timeout_ms: 5000,'},
+ {tone: 'noise', text: ' }'},
+ ],
+ optimized: [
+ {tone: 'meta', text: 'src/config.rs · 1 line changed'},
+ {tone: 'meta', text: '@@ -42,3 +42,3 @@ Defaults'},
+ {tone: 'noise', text: ' compression: true,'},
+ {tone: 'remove', text: '- truncate_arrays_at: 16,'},
+ {tone: 'add', text: '+ truncate_arrays_at: 32,'},
+ {tone: 'noise', text: ' stash: true'},
+ ],
+ },
+} as const;
+
+type TokenDemoId = keyof typeof tokenDemos;
+
+const tokenlessViews: readonly CapabilityDemo[] = (
+ Object.entries(tokenDemos) as [TokenDemoId, (typeof tokenDemos)[TokenDemoId]][]
+).map(([id, demo]) => ({
+ id,
+ ...demo,
+ sourceLabel: {en: 'Original tool output', zh: '原始工具输出'},
+ resultLabel: {en: 'Context-ready output', zh: '上下文就绪输出'},
+ resultStatus: {en: 'signal preserved', zh: '关键信号已保留'},
+ action: {en: 'compress', zh: '压缩'},
+}));
+
+const capabilityShowcases: readonly CapabilityShowcase[] = [
+ {
+ id: 'cosh-ng',
+ componentLabel: 'cosh-ng',
+ accent: 'cyan',
+ processor: 'cosh-ng',
+ eyebrow: {en: 'COSH-NG · TERMINAL COLLABORATION', zh: 'COSH-NG · 终端协作'},
+ title: {
+ en: 'Keep your terminal. Keep your session.',
+ zh: '不换终端,不搬会话。',
+ },
+ intro: {
+ en: 'Cosh-ng layers AI onto the bash or zsh you already use. Commands, aliases, scripts, and interactive programs keep working while the Agent takes over only when you ask.',
+ zh: 'Cosh-ng 把 AI 叠在原来的 Shell 会话上。命令、别名、脚本和交互程序照常工作,需要时让 Agent 接手。',
+ },
+ note: {
+ en: 'Ask directly, accept a failure insight, or start with a login health check. Tab\u00a0and\u00a0Enter submit; typing on ignores it.',
+ zh: '直接交代任务,也可以采纳失败洞察或登录健康检查。按 Tab\u00a0和\u00a0Enter 提交,继续输入即可忽略。',
+ },
+ views: [
+ {
+ id: 'terminal',
+ icon: '>_',
+ name: {en: 'Terminal session', zh: '终端会话'},
+ metricLabel: {en: 'Interaction', zh: '协作方式'},
+ metricValue: 'SHELL + AGENT',
+ sourceLabel: {en: 'Task in the shell', zh: 'Shell 中的任务'},
+ resultLabel: {en: 'Agent workspace', zh: 'Agent 工作现场'},
+ resultStatus: {en: 'control preserved', zh: '控制权始终保留'},
+ action: {en: 'collaborate', zh: '协作'},
+ copy: {
+ en: 'Natural-language tasks, tool output, and approval steps share one terminal. Interrupt now and resume the same conversation later.',
+ zh: '自然语言任务、工具输出和确认步骤都在一个终端里。你可以随时中断,也可以稍后继续同一段会话。',
+ },
+ stages: ['Agent pane', 'Approval', 'Resume'],
+ raw: [
+ {tone: 'meta', text: '$ cosh-ng'},
+ {tone: 'keep', text: 'you › fix the failing checkout tests'},
+ {tone: 'noise', text: 'agent › inspecting the workspace'},
+ {tone: 'meta', text: 'tool › cargo test checkout'},
+ {tone: 'keep', text: 'checkout::expired_session ... FAILED'},
+ {tone: 'noise', text: 'agent › tracing the failing branch'},
+ {tone: 'keep', text: 'proposal › edit src/checkout.rs'},
+ {tone: 'meta', text: 'approval › waiting for your decision'},
+ ],
+ optimized: [
+ {tone: 'meta', text: 'session task-4c21 · resumable'},
+ {tone: 'keep', text: 'agent pane › plan + live output'},
+ {tone: 'keep', text: 'approval card › edit src/checkout.rs'},
+ {tone: 'add', text: '✓ approved for this step'},
+ {tone: 'meta', text: '$ cargo test checkout'},
+ {tone: 'add', text: 'test result: ok · 8 passed'},
+ {tone: 'noise', text: 'Ctrl+C › return to the shell anytime'},
+ ],
+ },
+ ],
+ },
+ {
+ id: 'tokenless',
+ componentLabel: 'Tokenless',
+ accent: 'lime',
+ processor: 'tokenless',
+ eyebrow: {en: 'TOKENLESS · TOOL OUTPUT COMPRESSION', zh: 'TOKENLESS · 工具输出压缩'},
+ title: {en: 'Keep what matters. Send fewer tokens.', zh: '保留关键信息,少用一些 Token。'},
+ intro: {
+ en: 'Tokenless compresses tool output before it reaches the model. Errors, changes, and useful fields stay in context. Repeated records and progress noise take up less space.',
+ zh: 'Tokenless 会在工具输出进入模型前先做一次压缩。错误、变更和关键字段留下,重复内容和过程噪声少占上下文。',
+ },
+ note: {
+ en: 'These ranges come from repository benchmarks. Results vary by payload and cannot be translated directly into provider billing savings.',
+ zh: '这里展示仓库中的 Benchmark 区间。实际结果会随 Payload 变化,也不能直接换算成 Provider 账单的节省比例。',
+ },
+ noteLink: {en: 'Read the benchmark methodology', zh: '查看 Benchmark 方法'},
+ noteHref: 'https://github.com/alibaba/anolisa/tree/main/src/tokenless/benchmark',
+ views: tokenlessViews,
+ },
+ {
+ id: 'agentsight',
+ componentLabel: 'AgentSight',
+ accent: 'lime',
+ processor: 'agentsight',
+ eyebrow: {en: 'AGENTSIGHT · TRAJECTORY & TOKEN VISIBILITY', zh: 'AGENTSIGHT · 轨迹与 TOKEN 观测'},
+ title: {en: 'Lay an Agent run out in front of you.', zh: '把一次 Agent 运行摊开来看。'},
+ intro: {
+ en: 'Model responses, tool calls, observations, and token use return to one structured trajectory, so you can see what happened inside a run.',
+ zh: '模型调用了什么,工具返回了什么,上下文花在哪里,都会回到同一份运行轨迹里。',
+ },
+ note: {
+ en: 'Linux adds eBPF visibility without modifying Agent code. macOS can collect local sessions and display their trajectories.',
+ zh: 'Linux 上无需修改 Agent 代码即可获得 eBPF 深度观测。macOS 可以采集本地会话并查看运行轨迹。',
+ },
+ views: [
+ {
+ id: 'trajectory',
+ icon: '◎',
+ name: {en: 'Run trajectory', zh: '运行轨迹'},
+ metricLabel: {en: 'Visibility', zh: '观测范围'},
+ metricValue: 'TRACE + TOKENS',
+ sourceLabel: {en: 'Live agent events', zh: '实时 Agent 事件'},
+ resultLabel: {en: 'Structured trajectory', zh: '结构化运行轨迹'},
+ resultStatus: {en: 'run made inspectable', zh: '运行过程可检查'},
+ action: {en: 'observe', zh: '观测'},
+ copy: {
+ en: 'Model calls and tool activity become one ordered trajectory. On Linux, token events show where context is being spent.',
+ zh: '模型调用和工具活动会按顺序汇成一条轨迹。在 Linux 上,Token 事件还能说明上下文主要花在了哪里。',
+ },
+ stages: ['Collect', 'Correlate', 'Inspect'],
+ raw: [
+ {tone: 'meta', text: 'trace.start › run-84f1'},
+ {tone: 'keep', text: 'model.request › plan checkout fix'},
+ {tone: 'noise', text: 'process.exec › git status'},
+ {tone: 'keep', text: 'tool.call › search_code'},
+ {tone: 'noise', text: 'file.open › src/checkout.rs'},
+ {tone: 'keep', text: 'model.response › propose patch'},
+ {tone: 'meta', text: 'token.event › prompt + completion'},
+ {tone: 'noise', text: 'trace.end › success'},
+ ],
+ optimized: [
+ {tone: 'meta', text: 'run-84f1 · success · 2.4s'},
+ {tone: 'keep', text: '01 model › formed a plan'},
+ {tone: 'keep', text: '02 tool › searched repository'},
+ {tone: 'keep', text: '03 file › inspected checkout.rs'},
+ {tone: 'keep', text: '04 model › proposed the patch'},
+ {tone: 'add', text: 'tokens › prompt · completion · tools'},
+ {tone: 'noise', text: 'viewer › replay any event in context'},
+ ],
+ },
+ ],
+ },
+ {
+ id: 'ws-ckpt',
+ componentLabel: 'ws-ckpt',
+ accent: 'amber',
+ processor: 'ws-ckpt',
+ eyebrow: {en: 'WS-CKPT · WORKSPACE RECOVERY', zh: 'WS-CKPT · 工作区恢复'},
+ title: {en: 'Restore a known-good workspace when changes go wrong.', zh: '工作区出了问题,退\u2060回上一个可用状态。'},
+ intro: {
+ en: 'With automatic checkpoints enabled, ws-ckpt keeps a baseline and end-of-turn recovery points. Preview affected files first, then restore the whole workspace when you are ready.',
+ zh: '显式开启自动检查点后,ws-ckpt 会在会话开始和每轮结束时留下恢复点。回滚前先看哪些文件会变化,确认后再恢复整个工作区。',
+ },
+ note: {
+ en: 'Automatic checkpoints are opt-in. The CLI runs without root while privileged snapshot operations stay inside the Linux daemon.',
+ zh: '自动检查点需要显式开启。CLI 无需 root,特权快照操作只在 Linux Daemon 内完成。',
+ },
+ views: [
+ {
+ id: 'recovery',
+ icon: '↶',
+ name: {en: 'Checkpoint & rollback', zh: '检查点与回滚'},
+ metricLabel: {en: 'Snapshot creation', zh: '快照创建'},
+ metricValue: 'CoW SNAPSHOT',
+ sourceLabel: {en: 'Changing workspace', zh: '正在变化的工作区'},
+ resultLabel: {en: 'Recovery point', zh: '可恢复检查点'},
+ resultStatus: {en: 'rollback ready', zh: '已可回滚'},
+ action: {en: 'checkpoint', zh: '创建检查点'},
+ copy: {
+ en: 'Each saved turn becomes a recovery point. Preview the affected files, then roll back along the snapshot history when a change goes wrong.',
+ zh: '每个已保存的回合都会成为恢复点。改动出错时,可以先预览受影响文件,再沿快照历史快速回退。',
+ },
+ stages: ['Checkpoint', 'Diff', 'Rollback'],
+ raw: [
+ {tone: 'meta', text: '$ ws-ckpt checkpoint -s before-refactor'},
+ {tone: 'keep', text: 'workspace › ~/project'},
+ {tone: 'noise', text: 'agent edits › src/checkout.rs'},
+ {tone: 'noise', text: 'agent edits › src/session.rs'},
+ {tone: 'remove', text: 'tests › checkout regression detected'},
+ {tone: 'meta', text: '$ ws-ckpt rollback -s before-refactor --preview'},
+ {tone: 'keep', text: 'preview › 2 files will be restored'},
+ ],
+ optimized: [
+ {tone: 'add', text: 'checkpoint › before-refactor'},
+ {tone: 'meta', text: 'snapshot › ckpt-20260814-01'},
+ {tone: 'keep', text: 'diff › src/checkout.rs modified'},
+ {tone: 'keep', text: 'diff › src/session.rs modified'},
+ {tone: 'noise', text: 'preview › no files changed yet'},
+ {tone: 'add', text: 'rollback ready › confirm to restore'},
+ ],
+ },
+ ],
+ },
+ {
+ id: 'skillfs',
+ componentLabel: 'SkillFS',
+ accent: 'amber',
+ processor: 'skillfs',
+ eyebrow: {en: 'SKILLFS · SKILLS ON DEMAND', zh: 'SKILLFS · SKILLS 按需挂载'},
+ title: {en: 'Put only task-relevant Skills in view.', zh: '只把当前任务需要的 Skills 放到眼前。'},
+ intro: {
+ en: 'SkillFS organizes one Skill repository into focused views. Common Skills stay in front of the Agent; the rest remain discoverable when needed.',
+ zh: 'SkillFS 把同一座技能仓库整理成不同视图。常用 Skills 直接出现在 Agent 面前,其余能力留在次级视图,需要时再打开。',
+ },
+ note: {
+ en: 'SkillFS requires Linux and FUSE. It controls how Skills are exposed; scanning, signing, and risk decisions belong to the security layer.',
+ zh: 'SkillFS 需要 Linux 和 FUSE。它负责如何向 Agent 提供 Skills,扫描、签名和风险判断由安全层负责。',
+ },
+ views: [
+ {
+ id: 'mount',
+ icon: '▤',
+ name: {en: 'Mounted skill view', zh: 'Skill 挂载视图'},
+ metricLabel: {en: 'Exposure', zh: '提供方式'},
+ metricValue: 'ON DEMAND',
+ sourceLabel: {en: 'Local skill catalog', zh: '本地 Skill 目录'},
+ resultLabel: {en: 'Agent-facing view', zh: '面向 Agent 的视图'},
+ resultStatus: {en: 'skills mounted', zh: 'Skills 已挂载'},
+ action: {en: 'mount', zh: '挂载'},
+ copy: {
+ en: 'Choose a view, mount it, and let the Agent read the compiled instructions it needs. Secondary Skills remain discoverable without crowding the default view.',
+ zh: '选择视图并完成挂载,Agent 就能读取当前需要的编译后说明。其他 Skills 仍可发现,但不会挤满默认视图。',
+ },
+ stages: ['Select view', 'Compile', 'Mount'],
+ raw: [
+ {tone: 'meta', text: '/skills-source'},
+ {tone: 'keep', text: '├── coding/SKILL.md'},
+ {tone: 'keep', text: '├── review/SKILL.md'},
+ {tone: 'noise', text: '├── operations/SKILL.md'},
+ {tone: 'noise', text: '├── research/SKILL.md'},
+ {tone: 'meta', text: '└── skillfs-views.toml'},
+ {tone: 'keep', text: 'default = ["coding", "review"]'},
+ ],
+ optimized: [
+ {tone: 'meta', text: '/agent-skills · mounted'},
+ {tone: 'add', text: '├── coding/SKILL.md · compiled'},
+ {tone: 'add', text: '├── review/SKILL.md · compiled'},
+ {tone: 'keep', text: '└── skill-discover/SKILL.md'},
+ {tone: 'noise', text: 'secondary › operations, research'},
+ {tone: 'meta', text: 'ordinary files › source-backed'},
+ ],
+ },
+ ],
+ },
+ {
+ id: 'sec-core',
+ componentLabel: 'Agent Sec Core',
+ accent: 'amber',
+ processor: 'sec-core',
+ eyebrow: {en: 'AGENT SEC CORE · EXECUTION POLICY', zh: 'AGENT SEC CORE · 执行策略'},
+ title: {en: 'Give every security layer one clear job.', zh: '每个安全组件,各守住一层边界。'},
+ intro: {
+ en: 'Sandbox execution, Skill integrity, code scanning, and host hardening cover different risks. Use them independently or combine them into defense in depth.',
+ zh: '沙箱执行、Skill 完整性、代码扫描和主机加固分别处理不同风险。它们可以独立启用,也可以组合成纵深防护。',
+ },
+ note: {
+ en: 'Linux enforces the sandbox boundary. System hardening, asset verification, and host approval policies remain separate security layers.',
+ zh: 'Linux 负责落实沙箱边界。系统加固、Skill 资产校验和宿主审批策略是彼此独立的安全层。',
+ },
+ views: [
+ {
+ id: 'policy',
+ icon: '◇',
+ name: {en: 'Command policy', zh: '命令策略'},
+ metricLabel: {en: 'Security capabilities', zh: '安全能力'},
+ metricValue: '4',
+ sourceLabel: {en: 'Requested command', zh: '待执行命令'},
+ resultLabel: {en: 'Sandbox decision', zh: '沙箱执行策略'},
+ resultStatus: {en: 'policy applied', zh: '策略已应用'},
+ action: {en: 'classify', zh: '判断风险'},
+ copy: {
+ en: 'Each component handles a distinct security question, from the command boundary to Skill drift and host baseline findings.',
+ zh: '每个组件负责一个明确问题,从命令权限边界,到 Skill 漂移和主机基线风险,都能单独查看。',
+ },
+ stages: ['Classify', 'Policy', 'Sandbox'],
+ raw: [
+ {tone: 'meta', text: 'agent requests › npm install package-x'},
+ {tone: 'keep', text: 'operation › package install'},
+ {tone: 'noise', text: 'filesystem › workspace writes requested'},
+ {tone: 'noise', text: 'network › registry access requested'},
+ {tone: 'keep', text: 'risk signal › code execution + network'},
+ {tone: 'meta', text: 'decision pending'},
+ ],
+ optimized: [
+ {tone: 'keep', text: 'risk › medium'},
+ {tone: 'meta', text: 'decision › sandbox + confirmation'},
+ {tone: 'add', text: 'filesystem › workspace + /tmp only'},
+ {tone: 'remove', text: 'network › denied until approved'},
+ {tone: 'keep', text: 'approval › required from user'},
+ {tone: 'meta', text: 'audit › decision recorded'},
+ ],
+ },
+ ],
+ },
+] as const satisfies readonly CapabilityShowcase[];
+
+type CapabilityId = (typeof capabilityShowcases)[number]['id'];
+
+const capabilityById = Object.fromEntries(
+ capabilityShowcases.map((capability) => [capability.id, capability]),
+) as Record;
+
+const componentCapabilityIds: Record = Object.fromEntries(
+ capabilityShowcases.map((capability) => [capability.componentLabel, capability.id]),
+) as Record;
+
const scenarios = {
en: [
{
role: 'TERMINAL COLLABORATION',
name: 'Cosh-ng',
- title: 'Bring Agent collaboration back to the terminal.',
- surfaceTitle: 'Let the Agent work inside your terminal.',
- proof: 'Linux entry point for the Agent era',
- surfaceBody:
- 'Follow live output, run commands, and take control back at any time.',
+ title: 'Run and take control of Agents in the terminal.',
+ surfaceTitle: 'Let Agents work directly in your terminal.',
+ proof: 'No separate chat window required',
+ surfaceBody: 'Follow live output and take control whenever you need to.',
body:
- 'Cosh-ng runs inside the Shell you already use. Natural-language tasks, tools, Skills, Hooks, MCP, and multiple models are available directly from the terminal without opening a separate chat window.',
+ 'Cosh-ng runs in the Shell you already use. Give it tasks in natural language, call tools and Skills, and connect existing workflows through Hooks or MCP.',
promise:
- 'Work still happens in the Shell. The Agent simply adds another layer of capability.',
- cta: 'Explore Cosh-ng',
+ 'The terminal remains your workspace, and you can interrupt or resume the Agent at any time.',
+ cta: 'Start with Cosh-ng',
components: [
{
label: 'cosh-ng',
+ description: 'Run Agents in the terminal and take control at any time.',
href: '/docs/user-guide/user-entrypoint/cosh-ng/quickstart',
},
- {
- label: 'Cosh',
- href: '/docs/user-guide/user-entrypoint/copilot-shell/quickstart',
- },
],
href: '/docs/user-guide/user-entrypoint/cosh-ng/quickstart',
accent: 'cyan',
@@ -91,27 +542,24 @@ const scenarios = {
{
role: 'TOKEN & CONTEXT',
name: 'Token Flow',
- title: 'Measure Token use. Reduce it.',
- surfaceTitle: 'Keep your harness. Start saving Tokens with one command.',
+ title: 'See where Tokens go and reduce tool-output cost.',
+ surfaceTitle: 'Compress tool output without changing Agent code.',
proof: '30–70% tool-output compression*',
surfaceBody:
- 'Supports Claude Code, Codex, Qoder, and more; original content stays retrievable.',
+ 'Works with Claude Code, Codex, Qoder, and more. Original content stays retrievable.',
body:
- 'From context compression and memory reuse to usage tracking, Token Flow makes Agent Token consumption more efficient and transparent, and integrates into existing workflows on demand.',
- promise:
- 'No Agent code changes. The savings remain visible in the statistics.',
+ 'Tokenless compresses JSON, logs, and diffs before tool output reaches the model. AgentSight records trajectories and tracks Token usage on Linux so you can see where the context is going.',
+ promise: 'Review the compression result and retrieve original content when needed.',
cta: 'Start with Tokenless',
components: [
{
label: 'Tokenless',
+ description: 'Compress tool output before it enters the model context.',
href: '/docs/user-guide/token-saving/tokenless/quickstart',
},
- {
- label: 'Agent Memory',
- href: '/docs/user-guide/token-saving/agent-memory',
- },
{
label: 'AgentSight',
+ description: 'Inspect trajectories and track Token usage on Linux.',
href: '/docs/user-guide/agent-observability/agentsight',
},
],
@@ -119,41 +567,36 @@ const scenarios = {
accent: 'lime',
},
{
- role: 'SANDBOX EXECUTION',
- name: 'Sandbox Infra',
- title: 'Give Agents an isolated, recoverable execution environment.',
- surfaceTitle: 'Run risky work in an isolated, recoverable sandbox.',
- proof: 'Runtime · ms snapshots / rollback',
+ role: 'RUNTIME & SECURITY',
+ name: 'Agent Runtime',
+ title: 'Run Agent tasks with isolation and workspace recovery.',
+ surfaceTitle: 'Isolate risky commands and keep workspace recovery points.',
+ proof: 'Isolation · snapshots · Skills on demand',
surfaceBody:
- 'Track changes, enforce boundaries, and return to a checkpoint when needed.',
+ 'Agent Sec Core limits risky commands. ws-ckpt handles recovery, while SkillFS mounts Skills on demand.',
body:
- 'ANOLISA manages sandbox environments, Agent Sec Core isolates risky commands, ws-ckpt keeps recovery points for workspace changes, and SkillFS mounts Skills on demand. Each capability can run independently or as part of the same runtime.',
+ 'Agent Sec Core classifies commands and applies sandbox policies. ws-ckpt creates fast workspace checkpoints and rolls back file changes. SkillFS exposes selected Skills through a mounted filesystem when they are needed.',
promise:
- 'From environment preparation and risk isolation to change recovery, Agent execution gets a clear system boundary.',
- cta: 'Explore ANOLISA CLI',
+ 'These Linux components work independently and can be combined for tasks that need stronger controls.',
+ cta: 'Start with ws-ckpt',
components: [
- {
- label: 'ANOLISA CLI',
- href: '/docs/user-guide/user-entrypoint/anolisa-cli',
- },
- {
- label: 'Agent Sec Core',
- href: '/docs/user-guide/agent-security/agent-sec-core/quickstart',
- },
{
label: 'ws-ckpt',
+ description: 'Create workspace checkpoints and roll back file changes.',
href: '/docs/user-guide/runtime/ws-ckpt',
},
{
label: 'SkillFS',
+ description: 'Expose selected Skills through a mounted filesystem.',
href: '/docs/user-guide/runtime/skillfs',
},
{
- label: 'Blaze',
- href: 'https://github.com/alibaba/anolisa/tree/main/src/blaze',
+ label: 'Agent Sec Core',
+ description: 'Classify risky commands and apply sandbox policies.',
+ href: '/docs/user-guide/agent-security/agent-sec-core/quickstart',
},
],
- href: '/docs/user-guide/user-entrypoint/anolisa-cli',
+ href: '/docs/user-guide/runtime/ws-ckpt',
accent: 'amber',
},
],
@@ -161,23 +604,20 @@ const scenarios = {
{
role: '终端协作',
name: 'Cosh-ng',
- title: '把 Agent 协作带回终端',
+ title: '在终端里运行 Agent,也能随时接管',
surfaceTitle: '让 Agent 直接在你的终端里工作',
- proof: 'AI Agent 时代重构 Linux 操作入口',
- surfaceBody: '跟随终端输出、执行命令,你可以随时接管。',
+ proof: '无需切换到单独的聊天窗口',
+ surfaceBody: '跟随实时输出,需要时随时接管。',
body:
- 'Cosh-ng 就运行在熟悉的 Shell 里。自然语言任务、工具、Skills、Hooks、MCP 和多种模型都能从终端直接调用,不需要另开一个聊天窗口。',
- promise: '工作仍在 Shell 里完成,Agent 只是多了一层能力。',
- cta: '了解 Cosh-ng',
+ 'Cosh-ng 运行在你熟悉的 Shell 里。你可以用自然语言分配任务,调用工具和 Skills,并通过 Hooks 或 MCP 接入现有工作流。',
+ promise: '终端仍是工作现场,你可以随时中断或恢复 Agent。',
+ cta: '开始使用 Cosh-ng',
components: [
{
label: 'cosh-ng',
+ description: '在终端中运行 Agent,需要时随时接管。',
href: '/docs/user-guide/user-entrypoint/cosh-ng/quickstart',
},
- {
- label: 'Cosh',
- href: '/docs/user-guide/user-entrypoint/copilot-shell/quickstart',
- },
],
href: '/docs/user-guide/user-entrypoint/cosh-ng/quickstart',
accent: 'cyan',
@@ -185,25 +625,23 @@ const scenarios = {
{
role: 'TOKEN 与上下文',
name: 'Token Flow',
- title: '让 Token 消耗可测、可省',
- surfaceTitle: '不换 Harness,一行命令开始节省 Token',
+ title: '看清 Token 花在哪里,减少工具输出开销',
+ surfaceTitle: '无需修改 Agent 代码,直接压缩工具输出',
proof: '30~70% 工具输出压缩*',
surfaceBody: '支持 Claude Code、Codex、Qoder 等,压缩后仍可取回原文。',
body:
- '从上下文压缩、记忆复用到开销追踪,Token Flow 让 Agent 的 Token 使用更高效、更透明,并可按需接入现有工作流。',
- promise: '不改 Agent 代码,省了多少 Token 在统计里看得见。',
+ 'Tokenless 会在工具输出进入模型前压缩 JSON、日志和 Diff。AgentSight 记录运行轨迹,并在 Linux 上统计 Token 用量,让你知道上下文花在了哪里。',
+ promise: '压缩结果可以查看,需要时仍能取回原始内容。',
cta: '从 Tokenless 开始',
components: [
{
label: 'Tokenless',
+ description: '在工具输出进入模型上下文前完成压缩。',
href: '/docs/user-guide/token-saving/tokenless/quickstart',
},
- {
- label: 'Agent Memory',
- href: '/docs/user-guide/token-saving/agent-memory',
- },
{
label: 'AgentSight',
+ description: '查看运行轨迹,并在 Linux 上统计 Token 用量。',
href: '/docs/user-guide/agent-observability/agentsight',
},
],
@@ -211,44 +649,54 @@ const scenarios = {
accent: 'lime',
},
{
- role: '沙箱执行',
- name: 'Sandbox Infra',
- title: '为 Agent 提供可隔离、可恢复的执行环境',
- surfaceTitle: '让高风险任务隔离运行,也能随时恢复',
- proof: 'Runtime · 毫秒级工作区快照 / 回滚',
- surfaceBody: '约束权限、记录操作,失败时回到检查点。',
+ role: '运行与安全',
+ name: 'Agent Runtime',
+ title: '隔离高风险操作,也为工作区保留恢复点',
+ surfaceTitle: '隔离高风险命令,并为工作区保留恢复点',
+ proof: '隔离执行 · 工作区快照 · Skills 按需挂载',
+ surfaceBody: 'Agent Sec Core 限制高风险命令,ws-ckpt 负责恢复,SkillFS 按需挂载 Skills。',
body:
- 'ANOLISA 管理沙箱环境,Agent Sec Core 隔离高风险命令,ws-ckpt 为工作区变更保留恢复点,SkillFS 按需挂载 Skills。各项能力既可独立启用,也可以组合使用。',
- promise: '从环境准备、风险隔离到变更恢复,为 Agent 执行提供清晰的系统边界。',
- cta: '查看 ANOLISA CLI',
+ 'Agent Sec Core 会判断命令风险并应用沙箱策略。ws-ckpt 可以创建工作区检查点,也能回滚文件变更。SkillFS 在需要时通过挂载文件系统提供指定 Skills。',
+ promise: '这些组件面向 Linux,可以独立启用,也可以按任务需要组合使用。',
+ cta: '从 ws-ckpt 开始',
components: [
- {
- label: 'ANOLISA CLI',
- href: '/docs/user-guide/user-entrypoint/anolisa-cli',
- },
- {
- label: 'Agent Sec Core',
- href: '/docs/user-guide/agent-security/agent-sec-core/quickstart',
- },
{
label: 'ws-ckpt',
+ description: '创建工作区检查点,出现问题时回滚文件变更。',
href: '/docs/user-guide/runtime/ws-ckpt',
},
{
label: 'SkillFS',
+ description: '通过挂载文件系统向 Agent 提供指定 Skills。',
href: '/docs/user-guide/runtime/skillfs',
},
{
- label: 'Blaze',
- href: 'https://github.com/alibaba/anolisa/tree/main/src/blaze',
+ label: 'Agent Sec Core',
+ description: '判断命令风险,并为执行过程应用沙箱策略。',
+ href: '/docs/user-guide/agent-security/agent-sec-core/quickstart',
},
],
- href: '/docs/user-guide/user-entrypoint/anolisa-cli',
+ href: '/docs/user-guide/runtime/ws-ckpt',
accent: 'amber',
},
],
} as const;
+const scenarioRailIcons = {
+ cyan: '>_',
+ lime: '{}',
+ amber: '[]',
+} as const;
+
+const componentRailIcons: Record = {
+ 'cosh-ng': '>_',
+ Tokenless: 'T/',
+ AgentSight: '◎',
+ 'Agent Sec Core': '◇',
+ 'ws-ckpt': '↶',
+ SkillFS: '▤',
+};
+
const routes = {
en: [
{
@@ -302,6 +750,722 @@ const routes = {
],
} as const;
+function CoshVisual({locale}: {locale: Locale}) {
+ const zh = locale === 'zh';
+ const [activeView, setActiveView] = useState<'handoff' | 'insight' | 'health'>('handoff');
+ const viewLabels = [
+ ['handoff', zh ? '一句话接手' : 'Ask in plain language', zh ? '自然语言、审批与原生交互' : 'Intent, approval, and native interaction'],
+ ['insight', zh ? '失败后补位' : 'Help after failure', zh ? '命令挂了,Tab 采纳分析' : 'Accept an insight with Tab'],
+ ['health', zh ? '登录健康检查' : 'Login health check', zh ? '风险和排查建议直接出现在首屏' : 'See risks and next steps as you log in'],
+ ] as const;
+
+ return (
+
+
+ {viewLabels.map(([id, label, description]) => (
+ setActiveView(id)} key={id}>
+ {label} {description}
+
+ ))}
+
+
+
+ cosh-ng · bash/zsh{zh ? '人机共驾' : 'COPILOT SHELL'}
+
+ {activeView === 'handoff' && (
+
+
❯ {zh ? '新建一个 Vite 项目,交互问题我来回答' : 'Create a Vite project; I will answer interactive prompts'}
+
+ {zh ? '副驾准备执行' : 'COPILOT IS READY'} Bash · {zh ? '中风险' : 'MEDIUM RISK'}
+ npm create vite@latest admin-demo
+ {zh ? '查看完整命令' : 'review full command'} {zh ? '允许一次 ↵' : 'allow once ↵'}
+
+
+
? Install with npm and start now? Yes / No
+
{zh ? '命令正在等待你的输入' : 'The command is waiting for your input'}
+
+
{zh ? 'AI 接住意图,键盘仍在你手里' : 'AI takes the intent. You keep the keyboard.'}
+
+ )}
+
+ {activeView === 'insight' && (
+
+
❯ cargo test -q
error[E0308]: mismatched types --> src/config.rs:9:20 expected u64 , found String
+
+ ! {zh ? '洞察:构建或测试失败' : 'Insight: build or test failed'}
+ {zh ? '分析这次构建或测试失败,定位首个可行动错误' : 'Analyze this failure and find the first actionable error'}
+ Tab {zh ? '填入' : 'fill'} Enter {zh ? '提交' : 'submit'} {zh ? '继续输入可忽略' : 'keep typing to ignore'}
+
+
src/config.rs:9 {zh ? 'timeout_ms 需要 u64' : 'timeout_ms expects u64'} test result: ok · 1 passed
+
{zh ? '它会补一句,但不会抢走提示符' : 'It offers a next step without taking the prompt.'}
+
+ )}
+
+ {activeView === 'health' && (
+
+
Last login 09:41 · tty1 ❯
+
+ {zh ? '登录健康概览' : 'LOGIN HEALTH'} {zh ? '1 个风险项' : '1 RISK'}
+ CPU 28% MEM 63% DISK 41%
+ ! {zh ? '近期发现 OOM 信号' : 'Recent OOM signal found'} cgroup memory limit · killed worker
+
+
{zh ? '可以试试' : 'TRY THIS'} {zh ? '帮我分析最近一次 OOM 的原因,重点看被杀进程、cgroup 和当时内存水位。' : 'Analyze the latest OOM, focusing on the killed process, cgroup, and memory level.'}
Tab {zh ? '填入后按 Enter 提交' : 'then Enter to submit'}
+
{zh ? '一登录,就知道先查哪里' : 'Log in and know where to start.'}
+
+ )}
+
+
+ );
+}
+
+function AgentSightVisual({locale}: {locale: Locale}) {
+ const zh = locale === 'zh';
+ const [activeView, setActiveView] = useState<'trace' | 'tokens' | 'agents' | 'issues'>('trace');
+ const viewLabels = [
+ ['trace', zh ? '调用轨迹' : 'Call trace', zh ? '看输入如何走到模型与工具' : 'Follow input into model and tool calls'],
+ ['tokens', zh ? 'Token 构成' : 'Token X-ray', zh ? '找到推高上下文的内容' : 'Find what drives context growth'],
+ ['agents', zh ? '子代理拓扑' : 'Subagents', zh ? '顺着高亮路径切换代理' : 'Follow the highlighted agent path'],
+ ['issues', zh ? '异常定位' : 'Interruptions', zh ? '让重复、截断和失败显形' : 'Expose loops, truncation, and failure'],
+ ] as const;
+
+ return (
+
+
+ {viewLabels.map(([id, label, description]) => (
+ setActiveView(id)}
+ key={id}>
+ {label}
+ {description}
+
+ ))}
+
+
+
+
+ {zh ? '示例运行 run-84f1' : 'SAMPLE RUN run-84f1'}
+ ATIF v1.7
+
+
+ {activeView === 'trace' && (
+
+
+ 01
+ ⌨
+ {zh ? '用户输入' : 'USER INPUT'}
+ {zh ? '修复 checkout 测试' : 'Fix the checkout tests'}
+
+
+ 02
+ ◎
+ {zh ? 'Agent 提示词' : 'AGENT PROMPT'}
+ {zh ? '指令 + 对话 + 工具定义' : 'Instructions + history + tools'}
+
+
+ 03
+ ◉
+ {zh ? 'LLM 调用' : 'LLM CALL'}
+ 8.7K in · 412 out
+
+
+ 04
+ ⌕
+ TOOL CALL
+ search_code("checkout")
+ {zh ? '返回 18 条匹配' : '18 matches returned'}
+
+
+
{zh ? '从一句输入到每次模型与工具调用,都能按轮展开查看' : 'Inspect every model and tool call from the user input that started the turn'}
+
+ )}
+
+ {activeView === 'tokens' && (
+
+
STATIC USER ASSISTANT TOOLS INJECTED
+
+ {[48, 58, 66, 73, 96, 84].map((height, index) => (
+
+
+ STEP {index + 1}
+
+ ))}
+
+
+
+
+
{zh ? '工具输出推高了第 5 步上下文' : 'Tool output drove the step 5 context peak'} PEAK CONTEXT
+
+ )}
+
+ {activeView === 'agents' && (
+
+
+ ROOT
+ ◎
+ ROOT AGENT
+ {zh ? '修复 checkout 测试' : 'Fix checkout tests'}
+ 12 steps · 8.7K in
+
+
{zh ? '派生' : 'SPAWNS'}
+
+ 01
+ ⌕
+ RESEARCH
+ {zh ? '定位失败路径' : 'Locate the failing path'}
+ 4 steps · 4.1K in
+
+
+
+ 02
+ ◇
+ REVIEW
+ {zh ? '检查补丁' : 'Review patch'}
+
+
+ 03
+ ✓
+ TEST
+ {zh ? '当前查看的子代理' : 'Active subagent trace'}
+
+
+
root → research → test
+
{zh ? '父子关系和当前查看路径放在同一张拓扑里' : 'See parent-child relationships and the active trace path together'}
+
+ )}
+
+ {activeView === 'issues' && (
+
+
+ 01
+ ◉
+ {zh ? 'LLM 调用' : 'LLM CALL'}
+ {zh ? '继续查找 checkout' : 'Search checkout again'}
+
+
+ 02
+ ⌕
+ TOOL CALL
+ search_code("checkout")
+
+
+ 03
+ ↻
+ {zh ? '相同调用' : 'SAME CALL'}
+ {zh ? '参数和结果没有变化' : 'Same arguments and result'}
+
+
+ 04
+ !
+ {zh ? '异常定位' : 'INTERRUPTION'}
+ {zh ? '重复工具序列 ×4' : 'Repeated tool sequence ×4'}
+ DEAD LOOP · HIGH
+
+
+ 🤖
+ REPEAT ×4
+
+
{zh ? '重复调用、截断与失败都会落到具体事件,不再只剩一段报错' : 'Loops, truncation, and failures resolve to the exact event that caused them'}
+
+ )}
+
+
+ );
+}
+
+function CheckpointVisual({locale}: {locale: Locale}) {
+ const zh = locale === 'zh';
+ const [activeView, setActiveView] = useState<'rollback' | 'automatic' | 'preview' | 'branch'>('rollback');
+ const viewLabels = [
+ ['rollback', zh ? '回滚路线' : 'Rollback path', zh ? '整个工作区退回可用状态' : 'Restore the whole workspace'],
+ ['automatic', zh ? '自动检查点' : 'Auto checkpoints', zh ? '会话开始和每轮结束自动留存' : 'Save session start and turn end'],
+ ['preview', zh ? '先看再退' : 'Preview first', zh ? '确认前查看受影响文件' : 'Inspect affected files before restore'],
+ ['branch', zh ? '分支历史' : 'Branch history', zh ? '旧尝试保留,新路线继续' : 'Keep old attempts and continue'],
+ ] as const;
+
+ return (
+
+
+ {viewLabels.map(([id, label, description]) => (
+ setActiveView(id)} key={id}>
+ {label} {description}
+
+ ))}
+
+
+
+ ws-ckpt · ~/agent-workspaceCoW
+
+ {activeView === 'rollback' && (
+
+
+
+
+
+
+
✓ Baseline {zh ? '会话开始' : 'session start'}
+
✓ Turn 1 {zh ? '可用状态' : 'known good'}
+
✓ Turn 2 {zh ? '重构会话' : 'refactor'}
+
! Turn 3 {zh ? '测试回归' : 'regression'} HEAD
+
Turn 3 → Turn 1 {zh ? '恢复到可用检查点' : 'RESTORE A KNOWN-GOOD CHECKPOINT'}
+
+ )}
+
+ {activeView === 'automatic' && (
+
+
+ {[
+ ['Baseline', zh ? '会话开始' : 'session start'],
+ ['Turn 1', zh ? '回合结束' : 'turn end'],
+ ['Turn 2', zh ? '回合结束' : 'turn end'],
+ ['Turn 3', zh ? '回合结束' : 'turn end'],
+ ].map(([name, detail], index) =>
✓ {name} {detail}
)}
+
{zh ? '每轮结束,自动留一个恢复点' : 'Keep a recovery point after every turn'} {zh ? '需要显式开启 · 回合内仍可手动保存' : 'Opt-in · save important mid-turn states manually'}
+
+ )}
+
+ {activeView === 'preview' && (
+
+
HEAD Turn 3 {zh ? '当前工作区保持不变' : 'workspace remains unchanged'}
+
◉ {zh ? '只计算差异' : 'CALCULATE DIFF ONLY'}
+
+ {zh ? '回滚到 Turn 1 的预览' : 'Preview restore to Turn 1'} 0 {zh ? '项已执行' : 'APPLIED'}
+ ↶ src/checkout.rs{zh ? '恢复' : 'restore'}
+ ↶ src/session.rs{zh ? '恢复' : 'restore'}
+ {zh ? '确认前,Head 和文件都不会改变' : 'Head and files stay untouched until confirmation'}
+
+
+ )}
+
+ {activeView === 'branch' && (
+
+
+
+
+
+
+
Baseline
+
Turn 1
+
Turn 3 {zh ? '旧尝试保留' : 'kept'}
+
New Head {zh ? '从 Turn 1 继续' : 'continue from Turn 1'}
+
{zh ? '回退不会删除旧快照,新尝试会自然长成一条分支' : 'Rollback keeps old snapshots and lets a new branch grow'}
+
+ )}
+
+
+ );
+}
+
+function SkillFsVisual({locale}: {locale: Locale}) {
+ const zh = locale === 'zh';
+ const [activeView, setActiveView] = useState<'views' | 'discover' | 'transform' | 'activation'>('views');
+ const viewLabels = [
+ ['views', zh ? '视图隔离' : 'Focused views', zh ? '默认只展示当前工作集' : 'Show only the current working set'],
+ ['discover', zh ? '按需发现' : 'Discover', zh ? '从次级视图打开更多能力' : 'Open more from secondary views'],
+ ['transform', zh ? '读取时适配' : 'Read-time adapt', zh ? '把安装命令适配到当前系统' : 'Adapt install commands to this system'],
+ ['activation', zh ? '可信版本' : 'Trusted version', zh ? '落实外部安全提供方的决定' : 'Apply an external security decision'],
+ ] as const;
+
+ return (
+
+
+ {viewLabels.map(([id, label, description]) => (
+ setActiveView(id)} key={id}>
+ {label} {description}
+
+ ))}
+
+
+
+
+
+ {activeView === 'views' && (
+
+
{zh ? '同一座技能仓库' : 'ONE SKILL REPOSITORY'} 16 {zh ? '个已安装' : 'INSTALLED'}
+
+ {['browser', 'research', 'slides', 'github', 'terminal', 'deploy', 'security', 'docs', 'pdf', 'data', 'review', 'ops'].map((skill) => {skill} )}
+
+
+
AGENT /skills {zh ? '当前视图' : 'CURRENT VIEW'}
+
4 / 16 {zh ? '当前可见' : 'VISIBLE NOW'}
+
{zh ? '只把当前任务需要的 Skills 放到眼前' : 'Put only task-relevant Skills in view'}
+
github terminal deploy review
+
+
+ )}
+
+ {activeView === 'discover' && (
+
+
/skills 4 {zh ? '个常用 Skills' : 'PRIMARY SKILLS'} github
terminal
deploy
review
+
+
+ research 4 skills
media 3 skills
operations 5 skills
+ {zh ? '次级视图仍然可发现和读取' : 'Secondary views remain discoverable and readable'}
+
+
research browser/SKILL.md {zh ? '打开说明,不会把它加入默认视图' : 'Open the instructions without adding it to the default view'}
+
+ )}
+
+ {activeView === 'transform' && (
+
+
{zh ? 'Skill 原始说明' : 'ORIGINAL SKILL'} deploy/SKILL.md sudo apt-get install -y libssl-dev {zh ? '源文件保持不变' : 'source stays unchanged'}
+
↻ OS Adapter {zh ? '目标 Alinux / Anolis' : 'target Alinux / Anolis'}
+
{zh ? 'Agent 在当前系统读到' : 'AGENT READS ON THIS SYSTEM'} deploy/SKILL.md sudo dnf install -y openssl-devel {zh ? '包管理器和软件包名一起适配' : 'package manager and package name adapted'}
+
{zh ? '读取时只改写 Agent 看到的 SKILL.md,源文件保持不变。' : 'Only the SKILL.md view is adapted at read time. The source file stays unchanged.'}
+
+ )}
+
+ {activeView === 'activation' && (
+
+
{zh ? '外部安全提供方给出决定' : 'EXTERNAL SECURITY PROVIDER DECIDES'} {zh ? 'SkillFS 只负责落实' : 'SKILLFS APPLIES IT'}
+
● current {zh ? '读取当前版本' : 'read live version'} ◐ fallback {zh ? '读取可信快照' : 'read trusted snapshot'} ○ hidden {zh ? '暂不出现在视图' : 'remove from view'}
+
github/SKILL.md fallback {zh ? '当前文件发生漂移,使用可信快照' : 'Current files drifted; trusted snapshot selected'}
+
{zh ? '扫描、签名和风险判断由安全层完成,SkillFS 不冒充安全扫描器' : 'Scanning, signing, and risk decisions remain in the security layer'}
+
+ )}
+
+
+ );
+}
+
+function SecurityVisual({locale}: {locale: Locale}) {
+ const zh = locale === 'zh';
+ const [activeView, setActiveView] = useState<'sandbox' | 'ledger' | 'scanner' | 'hardening'>('sandbox');
+ const [policy, setPolicy] = useState<'read' | 'write' | 'deny'>('write');
+ const viewLabels = [
+ ['sandbox', 'Linux Sandbox', zh ? '给命令刚好够用的系统权限' : 'Give commands just enough OS access'],
+ ['ledger', 'Skill Ledger', zh ? '让每次 Skill 变更都有迹可循' : 'Keep every Skill change traceable'],
+ ['scanner', 'Code Scanner', zh ? '在执行前发现可疑代码' : 'Catch suspicious code before execution'],
+ ['hardening', zh ? '系统加固' : 'System Hardening', zh ? '扫描并预览主机基线修复' : 'Scan and preview baseline remediation'],
+ ] as const;
+ const policies = {
+ read: {
+ command: 'git status',
+ label: zh ? '只读 · 无网络' : 'READ-ONLY · NO NETWORK',
+ detail: zh ? '整个文件系统只读' : 'The filesystem stays read-only',
+ },
+ write: {
+ command: 'npm install package-x',
+ label: zh ? '2 个可写目录' : '2 WRITABLE ROOTS',
+ detail: zh ? '只开放 Workspace 与 /tmp' : 'Only Workspace and /tmp are writable',
+ },
+ deny: {
+ command: 'rm -rf /',
+ label: zh ? '执行前拒绝' : 'REJECTED BEFORE EXECUTION',
+ detail: zh ? '破坏性命令不会进入沙箱' : 'The destructive command never enters the sandbox',
+ },
+ } as const;
+ const activePolicy = policies[policy];
+
+ return (
+
+
+ {viewLabels.map(([id, label, description]) => (
+ setActiveView(id)} key={id}>
+ {label} {description}
+
+ ))}
+
+
+
+ Agent Sec Core · Linux{activeView === 'sandbox' ? 'RUNTIME' : activeView === 'ledger' ? 'INTEGRITY' : activeView === 'scanner' ? 'PRE-EXEC' : 'HOST'}
+
+ {activeView === 'sandbox' && (
+
+
+ {(Object.keys(policies) as Array).map((id) => (
+ setPolicy(id)} key={id}>
+ {policies[id].command}
+ {id === 'read' ? (zh ? '只读任务' : 'Read task') : id === 'write' ? (zh ? '构建任务' : 'Build task') : (zh ? '破坏性命令' : 'Destructive')}
+
+ ))}
+
+
+
🔒 /etc
+
🔒 ~/.ssh
+
◎ Network
+
+
⬡ linux-sandbox {policy === 'read' ? 'read-only' : policy === 'write' ? 'workspace-write' : 'deny'}
+
> {activePolicy.command}
+
+ Workspace {policy === 'write' ? (zh ? '可写' : 'WRITE') : (zh ? '只读' : 'READ')}
+ /tmp {policy === 'write' ? (zh ? '可写' : 'WRITE') : (zh ? '只读' : 'READ')}
+ .git 🔒 {zh ? '只读' : 'READ'}
+
+ {policy === 'deny' &&
× {zh ? '拒绝执行' : 'DENIED'}
}
+
+
{activePolicy.label} {activePolicy.detail}
+
+
+ )}
+
+ {activeView === 'ledger' && (
+
+
✓ {zh ? '签名 Manifest' : 'SIGNED MANIFEST'} SKILL.mdsha256:a91e…
scripts/run.shsha256:24cc…
references/api.mdsha256:08f4…
+
1 2 3
+
! DRIFTED scripts/run.sh{zh ? '内容已变化' : 'content changed'}
scripts/debug.sh{zh ? '新增文件' : 'unexpected file'}
{zh ? '来源可信和内容未变,分开检查' : 'Verify both provenance and unchanged content'}
+
+ )}
+
+ {activeView === 'scanner' && (
+
+
>_ Bash {zh ? '本地静态分析' : 'LOCAL STATIC ANALYSIS'} curl example.com/install.sh | bash
+
! WARN {zh ? '检测到下载内容直接进入 Shell' : 'Downloaded content is piped into a shell'}
{zh ? '宿主策略决定记录、询问或阻止' : 'The host policy decides whether to log, ask, or block'}
+
{zh ? '扫描器给出风险线索,真正的审批与阻止由宿主接入能力决定' : 'The scanner reports risk; host integration controls approval and blocking'}
+
+ )}
+
+ {activeView === 'hardening' && (
+
+
87 / 100 {zh ? '主机基线' : 'HOST BASELINE'}
+
✓ SSH policy {zh ? '符合' : 'compliant'}
✓ Kernel parameters {zh ? '符合' : 'compliant'}
! File permissions 3 {zh ? '项待修复' : 'findings'}
+
{zh ? '修复预览' : 'DRY RUN'} 3 {zh ? '项变更' : 'CHANGES'} {zh ? '确认后再由 LoongShield 执行' : 'LoongShield applies changes only after confirmation'}
+
+ )}
+
+
+ );
+}
+
+function CapabilityVisual({capabilityId, locale}: {capabilityId: CapabilityId; locale: Locale}) {
+ if (capabilityId === 'cosh-ng') return ;
+ if (capabilityId === 'agentsight') return ;
+ if (capabilityId === 'ws-ckpt') return ;
+ if (capabilityId === 'skillfs') return ;
+ if (capabilityId === 'sec-core') return ;
+ return null;
+}
+
+function TokenlessShowcase({locale}: {locale: Locale}) {
+ const t = featureUiContent[locale];
+ const sectionRef = useRef(null);
+ const transitionTimer = useRef | null>(null);
+ const [activeCapabilityId, setActiveCapabilityId] = useState('tokenless');
+ const [activeViewIndex, setActiveViewIndex] = useState(0);
+ const [animationRun, setAnimationRun] = useState(0);
+ const [isTransitioning, setIsTransitioning] = useState(false);
+ const capability = capabilityById[activeCapabilityId];
+ const demo = capability.views[activeViewIndex];
+ const isTokenless = activeCapabilityId === 'tokenless';
+
+ const replay = () => setAnimationRun((run) => run + 1);
+ const transitionTo = (capabilityId: CapabilityId, viewIndex = 0) => {
+ if (transitionTimer.current) clearTimeout(transitionTimer.current);
+ setIsTransitioning(true);
+ const delay = window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 0 : 180;
+ transitionTimer.current = setTimeout(() => {
+ setActiveCapabilityId(capabilityId);
+ setActiveViewIndex(viewIndex);
+ setAnimationRun((run) => run + 1);
+ requestAnimationFrame(() => requestAnimationFrame(() => setIsTransitioning(false)));
+ }, delay);
+ };
+
+ const handleTabKeyDown = (event: KeyboardEvent) => {
+ if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return;
+ event.preventDefault();
+ const direction = event.key === 'ArrowRight' ? 1 : -1;
+ const nextIndex =
+ (activeViewIndex + direction + capability.views.length) % capability.views.length;
+ const buttons = event.currentTarget.parentElement?.querySelectorAll(
+ '.tokenDemoTab',
+ );
+ buttons?.[nextIndex]?.focus();
+ transitionTo(activeCapabilityId, nextIndex);
+ };
+
+ useEffect(() => {
+ const section = sectionRef.current;
+ if (!section) return;
+ const observer = new IntersectionObserver(
+ ([entry]) => {
+ if (!entry.isIntersecting) return;
+ replay();
+ observer.disconnect();
+ },
+ {threshold: 0.32},
+ );
+ observer.observe(section);
+ return () => {
+ observer.disconnect();
+ if (transitionTimer.current) clearTimeout(transitionTimer.current);
+ };
+ }, []);
+
+ return (
+
+
+
+
+
{capability.eyebrow[locale]}
+
{capability.title[locale]}
+
{capability.intro[locale]}
+
+
+ {capability.note[locale]}
+ {capability.noteHref && capability.noteLink && (
+
+ {capability.noteLink[locale]} ↗
+
+ )}
+
+
+
+
+
+
+ {isTokenless ? (
+
+ {capability.views.map((item, index) => {
+ const active = index === activeViewIndex;
+ return (
+ transitionTo(activeCapabilityId, index)}
+ onKeyDown={handleTabKeyDown}>
+ {item.icon}
+ {item.name[locale]}
+
+ );
+ })}
+
+ ) : (
+
+ {demo.icon}
+ {demo.name[locale]}
+ {capability.processor}
+
+ )}
+
+ {demo.metricLabel[locale]}
+ {demo.metricValue}
+
+
+
+ {isTokenless ? (
+
+
+
+ {demo.sourceLabel[locale]}
+ {demo.icon}
+
+
+ {demo.raw.map((line, index) => (
+
+ {line.text}
+
+ ))}
+
+
+
+
+ {capability.processor}
+ {demo.action[locale]}
+
+
+
+
+ {demo.resultLabel[locale]}
+ ✓ {demo.resultStatus[locale]}
+
+
+ {demo.optimized.map((line, index) => (
+
+ {line.text}
+
+ ))}
+
+
+
+ ) : (
+
+
+
+ )}
+
+
+
+
+
+
+
+
+ );
+}
+
export default function Home() {
const {i18n} = useDocusaurusContext();
const locale: Locale = i18n.currentLocale === 'zh' ? 'zh' : 'en';
@@ -393,6 +1557,8 @@ export default function Home() {
+
+
From c6acb4913b51f8039025f3688676b41f74197fc3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=A9=BA=E6=BE=88?=
Date: Sat, 15 Aug 2026 10:23:41 +0800
Subject: [PATCH 2/2] feat(sec-core): add Skill Ledger demo
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- add a Qoder walkthrough for signed, drifted, and denied Skills
- embed the demo video and link both localized guides
Signed-off-by: 空澈
---
README.md | 21 ++
README_zh.md | 21 ++
.../images/readme/skill-ledger-demo-cover.jpg | Bin 0 -> 258014 bytes
.../agent-sec-core/QUICKSTART.md | 8 +
.../agent-sec-core/qoder-skill-ledger-demo.md | 243 ++++++++++++++++++
.../agent-sec-core/QUICKSTART.md | 7 +
.../agent-sec-core/qoder-skill-ledger-demo.md | 229 +++++++++++++++++
7 files changed, 529 insertions(+)
create mode 100644 docs/images/readme/skill-ledger-demo-cover.jpg
create mode 100644 docs/user-guide/en/agent-security/agent-sec-core/qoder-skill-ledger-demo.md
create mode 100644 docs/user-guide/zh/agent-security/agent-sec-core/qoder-skill-ledger-demo.md
diff --git a/README.md b/README.md
index a146251dcc..c507f862e4 100644
--- a/README.md
+++ b/README.md
@@ -170,6 +170,27 @@ isolates risky operations, and
[ws-ckpt](https://agentic-os.sh/docs/user-guide/runtime/ws-ckpt/) keeps recovery
points for workspace changes.
+### Catch a changed Skill before it runs
+
+When a signed Skill changes, the Agent reports `drifted` before using it again.
+A rescan records blocking findings as `deny`.
+
+[Try the Agent demo →](https://agentic-os.sh/docs/user-guide/agent-security/agent-sec-core/qoder-skill-ledger-demo/)
+· [Skill Ledger guide](https://agentic-os.sh/docs/user-guide/agent-security/agent-sec-core/skill-ledger/)
+
+
+
[Choose a runtime or security starting point →](https://agentic-os.sh/docs/quickstart/)
· [Start with ANOLISA CLI](https://agentic-os.sh/docs/user-guide/user-entrypoint/anolisa-cli/)
diff --git a/README_zh.md b/README_zh.md
index 93829272b5..bf5c69ed0d 100644
--- a/README_zh.md
+++ b/README_zh.md
@@ -161,6 +161,27 @@ ANOLISA 正在完善面向 Agent 的执行环境。
隔离高风险操作,[ws-ckpt](https://agentic-os.sh/zh/docs/user-guide/runtime/ws-ckpt/)
为工作区变更保留恢复点。
+### 在 Skill 运行前发现它已被改动
+
+已签名的 Skill 发生变化后,Agent 会在再次调用前报告 `drifted`。
+重新扫描发现阻断级风险时,新版本记录为 `deny`。
+
+[查看 Agent 演示 →](https://agentic-os.sh/zh/docs/user-guide/agent-security/agent-sec-core/qoder-skill-ledger-demo/)
+· [Skill Ledger 手册](https://agentic-os.sh/zh/docs/user-guide/agent-security/agent-sec-core/skill-ledger/)
+
+
+
[选择运行与安全能力的开始位置 →](https://agentic-os.sh/zh/docs/quickstart/)
· [通过 ANOLISA CLI 开始](https://agentic-os.sh/zh/docs/user-guide/user-entrypoint/anolisa-cli/)
diff --git a/docs/images/readme/skill-ledger-demo-cover.jpg b/docs/images/readme/skill-ledger-demo-cover.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..151706c512bdc6ae19237f4614cebca270032e3d
GIT binary patch
literal 258014
zcmbTdc|4TS`!{|wn8;eAY=e-sEEx=8NcQZCWDCWRWsse*gc5^nHHncuTZ)i;iCr{{a9(pa3A?Pm0su5h(xXF3nQ{fZIs{_gpv|86$ETlAOx^c(@_6wH2-bTf9=d^qy67@0#5R821-gQ@Qap)n&yA+
z{a;_4`~+!Pw2YhFnd^?5PA}oPr^PjV*nE@eyGVQX8S6vS3J0+x@q&-BV$K4$b9&SHY;r
zVf3X2V*>}zrwtAyZMl9ZD-(@NMOm6Wcu
z{iW#Er8T_+j@#Xe0~}Y|<`wCzhM#04zY;0|b|GVenN94l*TD?bAKNK>2iU?zYTyM_
zF~-9Tw4=B;=dupcDv9Ker?c5Js4B#*P2+u(
z(6qmiupA%Qc>yY(Sw*Ai61j}frDU&`0ojDdikW@kQ0w6c_%C^DVJalENF5$fQisB;
z3F!DMQsD|Fo=_dk65eNz@S1`ueK4ut!c9_oO_Pn_1N-9yh0r88R*LJy(B0s%TuRsK
zaO&R=7?57;rTQD2+r66$_siLA2U0p;0Q~{())g;>@Ro_2DkD$k(%9Guna=v(2^c$^
zJnYReTI46Rp0W`W5PAWxu%)d(6F4C5){@kV_~W$M&bEwm61g<%88DcHV~|`h!YK?0
zmv=5MqLB+R*L)5J9r@wHoWTIIh$>C&R=XTV$%)q{H4HcWiaQw-A8=Ni@lgg^A=apC
z1{|NvUM@>c&PG|t1?=Pq;Td3Mgmcn(OWg3J!+?{ZPD_R#jPd#)y>IRn?Jk0uoo_yu
zeT;rKe5C>cANFde0;IKf34sF)&ce+!xHIikNzH`a&RmEAfnZ+-dy?QJ#7`NjLhxM`
zXOu@c;Od4vy%Kd4wpA7}*m37;*@?R83%Cl(HbaexGn|>Z5~_F_=@gjvT&SI6`cimP
ztYNU8P>8-T{K-7mAki;p9)VHOX6*Z>@lC^TC%a%dhAOwDy&pEz3uJV}b%a;kSZ`Ut
zt2ZqrEa0WqRD=j6V}fZAwi95@M2jyrNo6d-5z6;wtVB-HF4?=6N=v@8fUvGu279IC
zgzN<(N>IqPUcQ-3XWAJ<>lx`-W0p--d3jjvYpww?27a0hgU53TUVUh~8GF9Xj`EsaAlSHZUW2DeG
z{2HT3ea+FT9${xwiw3i1?3tabSzY96k$~x?Nenn!S)TDK7m(0LpOsQV>$>g`3~!Xf
zG3}Bc_F+qQlZ?qv<;8S5o>fj<@yx^HlbWK
z=DqPVeBr8#fhL})sC3%03~x0;+Bk
z^o$`U{UM$mGghL=#VCALN-c3P#o#gGRab{do2)QfQIDHq%qvOl_M64op%{Z$mKO~6
zeAzYPQltUt7gDk&OC~
zS=#cOc*`xzUH0PhaE^#RjPX2j>Fo{8FaG&2zBjSHdMm)*Nt3ABCz9>4ie6<5SV}C`
zyaZW9%*b~-J7+t}2+G-gNE%b~YfI7hGchT$ZS-qpn{t?^r^hD`t+7dP>aj7
zz<((lf|)Chh*?S+Udhvzg|@p_
z%zi7EZk~`Uy5LO+%4X6RQ7W9^987WvFcf&1pG!5EJY)AdVh9GNuJMF#QTg<^VcOES
zT>C59yZOx8GaQta6c2g1^I@2Y7!M78A))ak7w>jp=)C+~Qi5N;ZDOd1tR%9X5@UCM
zMTMUYQLD#hD-}bNbc235##pso_zu_LBjsd9i_kS4BoaZ*mkhxz<)`Y*iAyV!3
zvK=x^F^_l39S@A5OH>it5K+!Z{*BO(yrtTQ?oxBWJS?sg}|jbex_Y^M)--6>V<^*i2(CU1
zy@LrXcnrPM1nvicgR|3FC&6JaFF~8YzaWV06_?&e`y4gwgfcscgv~6MK+}yAe~AQo
z3Sauw1}w*%SxSc@DU)27h=jm6B@d^+7#-83rkrLN#4f0s;8>9F+W*LS9x@sxE0;f&
z4Teohe*$FEP__bgh`;5QyO4nf5pcggqk%+hWJ4;cEq8O8;ld0zn^$y)a*-m-IJB(X
zeU+q7Z@HB#o-8b-p*M9?cL=xi&4YzI*?Z-0Kg}8MEOp`-aDrA!91gD+3)B7lMWJkI
zY+ui55ManCrFz3F)|hyaCXyk8nv?0iic;~VnJsOwnv2>H(FkBsQICTiQKIYiVCy-I
z8qz9d_n%M$1=bUY_1btHG}|v>3hhptF9|O+6^-Z1
zVfJthr?YVj+f!*i>VQ1~gq?0ExFK@g54MqyisLmjkP*AIuKJGiPcWM4YrUv}1O!qd
zDaIA1dXa-ssZhGAUYLrD!;9X~f^#(841&pp3y(M1GK$bUXLzNX7Mn7oZ_DQjH~m3z
zMD13yEaTMWgxI*~62j#nu-DH$s4p)7j4I9fkQFV8P6WYrII_J%9&!A-##yy$V5l1v
z=*oLBR7#7MCm@+=F5fnt4nY4L_ELSYGL^%!zKYBm@xmP!AYumWN*UF)D96flr_B_?JZB45WM-iAV1+c{kQjaxm`YtVBG=HZ+5ndE?B!;g^6YBMGDUL>sT_r
zTGQaXPR+}G4Y?{}hJzvso-q0qvNKBKgehWc*ah*DoH+DiU~Kx}Y+3=KJV%5*?>+_}
z(mKsg%m=)}h3yx4Eu|mku^pD^mOtCeKhyPSJ|>OtH}AOleC~DkdhL(Z`G5V{Wf*qV
zFJofrFvjoZ<#VmF!}K9Cax$@3L}NXvQM~l{I92-yV*y9Sox{oJG|t|ko(PiXv(;aBSuHDQN~3HA>16d#|#@PFpD~<6s_UE+!_`36!+&cU9F8$m%ZFA5L59ygX4XY#+Fso
z6S$~KZNQdJxntxnXT8_=SYz`Z5kx~3OecL|qTx~|qKOG&>{`EKA4xhE6hgRP=2K)a
zATRZaiM{R+xS61i`s%)Y0<7jU!?yJQ7Sy24Pri|Xrwl_SaE)N(r#6Mv23^Kk7kI?liPX2Z{DU%{5b*SK5RcIAj5-DMCae6
zh+y%o!m{b1ik8~@?i+fZ)8ex~O^`~f_q~Ybohno={rLw**JiR%sK~PZA!D8+J=A(871V&v
zCiC!FJXx@=Mf-_kMDJO#>yC&~>qfi{3D)@4X57=}A&NwW?b?~HI$~DDwg?qqXTD;$
zSZV7>BGWCOLwWYj*^v3FDb80
zHt~6HQSZjmHu$shiyR(cMGYu;meR=765ApVy-saMkL}vM|L%z4_TM_8f*03M0JH=s
z?(U#7mZoY+;_USNz$yd;Q>G{`s&oRh#<);EV#eY~tWd#Gir8>&wU%?W=$CkuZ=G9DU&4cN)
z(^W%;;L;5Q3yHTbP0YFwr}7PXW~~j)Sw>%O{46{H95w&`M|9gq?TOiVGKA-klJud?
zOxFy_?hqu;=|Xc|O=i9?_&wagPO4zHWERz*t@Vi*`xa`C83ZlqVgrSE%|0JG0WeJDj=DC7PpSlJd8L(Ng$?pP`Jur@
zp>M%GNAc!*?lT$6?q_Y5CqN%nzoutD11iRB_WAA!P#u$boLcwZ;VOj|vKLj{g2AjB=u*L(G4C<$!minzhfRejSP5|d4wuxFY%WIH>rzG(gzsGKo
z=6|+3dv$Aryruuwyq_WybqYYBZ?Fc(@0LBeO$4CehPwi~a3D9wL%7(?5Qgrc#
zW{<(@8YnJ9^xlu)uAQY3WoAayEW819R{xx|+?hEC$Jg`VN~p0e)955vocAeIoEm;o#zU
z?xyU4i&Idtnb}juGEARe4?&Ue38251_eZ%m5^YhWm_P6T_EB@&d*|*x{--|BX7R@4
zankjPR{p&VQo_7=1S9o^GpvdiqZvIGwtXBT6(>^xv@?7RA5Nu@wv+&;|xzn}JgASC(
z0Ae`-UiloJ01z;8p0{>P{iO-Zlw8;{ExbIv$y8ix-Ls*Yk97&+=h?nG1%_Y0Q%+=#
zH_~E%S=E6`oCTFQ_HyHLP5!y*KvX1SOt8&VJD1w;hJ}D|(6Zaxer`J_zyt{#ChTf6
zd!8q$)r^20BcTqj`g=U`K+9bVsyKc@el4_i?sSa3b0cm4+1a&`6QJsJ>S4XYqbm^1
zfCP$&0FAn=#@;R83+0zz%KUg^Z}Y=p;;-o2B$HMqrl0fVMokcb9(jyp9^mJ*1|n)a
z{GXNuFSS`e#jpmmYP7?9ZANP4=ANj;Bl>8EIe!<@A7d
zbU(FaR;9rc%@pGLum6rv${qwciDxQS1}&JES4IrN788GN9oT@gM-&}#_a8k^nlOGAHTy8!%ck9fp8}cllaF6PwwG
zyQy1zC{e@xhP#sZlxfP(b0-sYL-4+H%NiDXrkgmjg#rWB3GjU^mHHBG4xLY|$s+Wh
zPDgO%ME@wWRndCUSXQT_1S+86IY6ggZTNE
zh>M$_BuP)R@@5L&fZ97cr8>Ng8=3nBERQ|o$Nx%H?@ARN!TWn>Yrz2fPc?(ii-M^Ipg3xDh6f}r_(p&(VA6grzXrZ^iq
z8wjWUXRD7_lO6)g@wr@2qfG{Oz7+@YKz)z+<*Ikc1D)iaTfvUAjGl_pe$eA5D3El)
zKUmK`Aa7D;@`}b+&48Y|+#*iqIEA-;8gu$;i9tKWk!3PH*!fR4%UEJpLC{b-q$@j-
zb=~T7aMv!TH0V;l^1l(M3Q3oVf8uZgbXED2PR&>MNzy^SU#Gl0`m4J5O^HYAAc0mo
zO-X9CC}P~S{m}X;A959{ntx+vi#Ctgn8;AP`;Z)=-oCNHlTBwLT{*Sn%7nH6TZhYv#tHm@Y5{S5bdq;OeVWEbkmifA6ET24Q
za~vmMN@j+1M!G|f+Zqq)7QSe5EM+8~Mi8Cb^`=B0?P)F7m>Us9hfgBXc
zz_y%EXkY_BvVcN7m37Z|pnGV4`Q`r}2-KV)DyTgsrsx|)NiZF^X@V7_Q6-q+R6K*O
zo>~xl$kBBONlaNPur$xu2}GDxx{%pcI1Nc!@?fF*kjNCQ21brNFi!x7|nRo)+
z2i>|_ELBUt1#|bBrD%jE-=)!0Pck4+k`(hZ&raEsTTsW5h_y^;|IwFyu#SBn500|F
z6W5_Bqj2+u?Bw<+?k4w-)7*hr!=B+xoPGXnXIL7HAEsA}f&_#Xh>IJjwId!d=^y^y
zP{(lE7k#OuR7ii3XS#7w}jC9k?i8!*MiLE*T_GFs>GJVVdHk>Qo
zt;#DJFQ~4crh{)_t`8*!NrTzoUo0CocE-{gh|Eq5fRau#Xumh%aY1jFB4jj^SE2uu
zWbW^R#1!+RH=)N3AP?WV8q9{xdY>)dtv^lE<55bC&MmRAj1`{o6Ah<1%GYKbOCNx>
zwE`1|J4iAe8Hp%JX@oDBezHM|mhx&&BVGu17_en0XF4B-Kz%;vw*n!ql*IUhV{k?>
z=f<-*DZ-S*KWTN_9->l)i`@%GU*ybsh)O(%y0ac9z)OZ@G7Y$xv_pe`AE~GReXJv%
zD@w=c)8A`^d4?CQ?88YT%53p}LqSXY%M)7TWi10z$6@}NHlM)J)rwJECjM*_n!+gt
ztDTPpbBSNeHY&u*ck4i2KPbBJIjvM>zT?y!o0{av~Iy=fx-&_tE)O#T-clWy+x
zgZP$P4-`>BQfontM|#GfVtjl`BYaTnJD?()9Tz)Gq+i^?TN3hvv1*OvA(GX%inFa?
zcsf->o_1l7^eUcpJnRH8h&a^?eTq%33XixMUS1<-TCGY?bGGc&wv+G8fZ+GwbiRk0
zvky@V*0l%6)u%ZTY2U7u^MVz}z?CIZIk3aCE)n_WNXh@dO3qP;Z
z`I6wB0rIN1(cXu+t;bAJ0^5Y2JQCy2WU_V~TW08CwX-iR
zKSe(NUxqQ{7^?6tMN%9ZT;7Mjn?90JLR@b=q6gUpH70qzDa!i!Uv65ebg{ug6MMC4
zj?yM^YhXplNXxUuU%P(-+~Oi9fBbobxc}1odi4pgP6XYs+EVIoqz+f2+T_1=*jDi{
zg7qZty^o+#?Tk9BO35F_TO#QT9Vg(np!Q-9$24`
zmP)3s%I91U?YFpM>b$SJq4}^XlZm!}@ABBtdgifnpyiPQkn|6r?Fm3PHypN&_xXe6
zNaI;E(KO2iQMOqfAr(&mJ8SHWIoQL*m-s8aH2Ty%BaX!44V!FZ2bhE?Kcc}Hd*|2S
zVd9Uo{n1deZ5o!uhH6QkJi5M$xR(V2{zqE5s~PHwUi+VoT@Gqa(}kx(V?~hi+VOL5
zCG21)$ykvLz!A?&u`9o^k)DfBe_`ovIVQDVdRGPpmf_+PfXS;b&O4YqifYNb*BFgF
z0TM2ck!i5IMYwLDAj^*}tL$2~6*%p6nOc&MKB`>2kqE}e5-s--_>L9FFP?)V@V%HB
zH|>hvZGjnX5%X`Of56Tx{=^+_Z
z2I4T7ah+U|qr#4jfjvq}`djD0?Hl`_UZ6AE96K+te0t%mM?zUVQ$GRpQj5M!fMagx
z%?Mn-r~UcS2{1GOD!y900qzO{R+_@Df!e_=T)1A7Upmx#D;vx*Ps#636a4V25T4`N
zoYPQh2oAv{&5~)npEn+z<(akYyxk#kra#14K4^NXqp0Tt_&5gFd^N-6fWBx$x(G5Q
zUtkKt)|YbX7HUUgFKueK4Vm`+3)2H^wjO>vE#u(mq^6s(XgS{hz(}6-yGZgbiai1T
zp{lv|yFZ3^gp_S!mt5%v!N&+U
zjiB>y2GM2$*s(rTu8qmeIr%}5j}oUIJY(`EF9&I4*|%AAIQ{nx3;2%mpOkEd8A(Y*
zQG(J2h@P)!##&{t6iXC49rCWmO{&+N{+RlKu=3{S!}9jin%z9fkGV|Yb{}>PtTPnNieq}kZ(TCD$y5Bt;@zp75mQH^XK6Z2xGUQDW0lW|fat4i`@B&W4v0LbGD{kmGItSK7i4
z4au@H=T8R7Kof2zmn~wc@0d)+&>MtL?B{E%m^lI%v|NiaZi%U2j51W@`zQp~ev`psR
zsQ1r$>q|aISHGlBp-N!Y^m&BIcquSOU8&N_aZtAB^7-STcv-$1CH9)g`+($$svZ8_
zGEU`=ex@gHECS26m1|qS;-c(de`~R`sooghboklea~%vdjwe9Wjj=9Q`9)-N$`V#G
z(=ryo(*6B7hibXr7>zGBw$K_{8T0>RMLu}H#yKCZvcNspcq1XjTE2|-IBWO1iw(_$
zMQ;S6%E=y1jPd0mbg>dGQEhBh&*S8^yLB}(m#}Jn&zj_KdB#-7c#p`NnCXf6e47Yd
zFEg31b-5ka==alQGxJCOo(*w7e#ev)w#BWD{gCH*^(rs+>IP*xB3_Wze7hy|+D|{$
zzw3%6o;eymFTg_@HkBw~cS6Z*rYgz}kw+tZ#r~5AD%?EeF6=PE+6>1|zD|*%wt5Yd
zy!d6IN~ibNft>5{qmaw9QD%|t_BrKJOGak8wV$WE>9@*$zd2M~3qYhQ2;vVImInE1
zKjF1yKOwKFU$R|WrGO3%Ho_IXX5;Lexvvf@!pnGddzDSjuP>TEHdDjhPNOp0r2hJW
z^@^u@2#P#^biME5#`$s-xNy|n)0+S+deHCd4&Ux*49vG
zLi(rJK9rknS?U#7S5pty3K%6FiC(0duMr}aL5cLAA6LbBKVR3SWGl^<$Oz@8K;3ZJ
zDcR|AT@Y`S)mHS~FZ+pXlrM>1$kiS{_!*-4rxW&&Rk(U6qOw1}4tuDyvh{1*rGdsQ
z%H@IhUhKrEy0t-SXF`)#L_)C3!tVW#0``NA7H;C}kFG9cEIf%3aP$nI29{<1%6TEY
zEW59WJssD4Z~}Oj^Y4`67@CO*3B;
zV5291gV}iI9Rye4kn$F*AgaDQkD_8GzAqGbxn^u@Pm_eV^tG^+<}~QhTX@qNVa!a8
zC=96>tY%5j?v?Z!%he0V(#3l~89KyFi*>bbJ-`gUY?7c!PGFMZVV^Y6ark0Ia{=Bi
zmxL45;QVYX8|>jE&2g<2E~VRiy|7tpxiCwYB_o+S8j{X&i+(BDd%4Wn);=?BmjLla
zwkw6)4>L-!Lwn&AhTb#IY~d;37x1zrR5Q1`fsXm;JdbSHpGit*)V>C~os!FdkXLS8
zXHuTh1(RrWE*F$BJDXAQioH+dUWASpc#g)N4U=h+h89a4PnhAjagQBFH_yf8iO!Dk
zZ(gj<%dC@Dk!oW20b@BH_YI;mJma1kaXoRyC)*8Lq8NKub4aXzl1M`{f&mP!kvuo<*#XI
z_{c!iXlNG(fGgd1RW4jf4`P3&YhkFS1BxJU
zCy%;jEB#`Q$u3+GSH9bZpc~602fgQ~5rOYWeAW6Nk>#4RpAseTnWJA@!jW0PikPd1TMFU)s|gP@fm~
zuIK86Kg}Gp>Ry7J%tsXEZJw-7UM`#y=fk&XGA(i8dA46oZcY8`XA4!B4_z6dOn;r{
zNgWvb
z&!0CxJh{d;uxlHU+DTZm(LT~93bjnQQ~4=t?N*svu;0FnYfjaDsyN?Z|AKJ=C46UL
ztY6_mZZ^Z6ACEVc9w|2OMLdG_er!zTIa|A`9!$H%)DfUm79PZ7Kl77=y`UWIng4}E;bBD6m#J2DGlkK&X{A>i)}rvl9y<(5QXT9k0lp*
zeAQs|RDt0Cwzf{OzqS~&8)*A>uj0csc1PDlg0ZTP5CL%9DXS9Tri`EKjFRxa*X1h1
zKyyz?d07{Tgx>eu`|W8iR%2%D*|19_eJ=m7#dVICyC_z*++5sqxhEA4!*xpele(@vc)CevUrt|x>r}_f$#v9_Cv4CcE@FpRgRp&`
zr~%;}d;j=jx}>?ZXS1*6L(;W<(EtX%caB%u{wqN{YGJ&
zSR*nnZ84;@ZxE^^l-hS|E%dG|d|A5CB+A~+9~K%&w`aq?c4uWP-jq19_e7?n5kJDG
zhPiUta-swIBc)$S3kmxsJTaz7F*D8L_jX#pyrw>U`|yI;%i()%<=0vtIdFD8+Vp6Y
z0{*ysRTL>0Ur|Wrh#SfAE##4)DzJi|X{ChnM>PNTFUt=ynYW>F8q04FVgEK{bWck^
z&I>i}U?Y(8P~ytFLQX5`PX=?%n>Lc>q^Lu!EufCr+K`^4kk^&zyV1jxP|kjzWUMY%
zxT?%Gq{tZ}6Ig2{JARMz&Yg3sz7Kz9-seN2%j@ngO&t}X6-5ySh2KVd|DmYU^oG%TKmbUzn89v!9tuA&yGtaHENobQ
z$d;x_NQ{@Xe^z@hega6+cil^ee5c13&h@I@if^xaF|l$%+4P()UAyRYn%2xIdHUkM
z5JI5I+3%yopJic+cWH8|8zLBzQ%9vO+XZ~j)i7~OCA3m`83ri~AOeeih?luhd6ram
zv9R3=&3dwtEprY7pbteN-yM?{_#d~fS>m1@V`iHMydo-;C72GwAJ
zv=zm%w^PeK@sO@RqgOs{?>_^h7&YLje4&A;A9kGO9+2ki$?1}OH_f?Iz}%{+Jj}tT
zLybE{(`u}a!Hc-jbocJhcBvP$i56NtV&?!fr<;XztT22{@A2UqwdM=>$WMh#(HC6x
zoxW?HXHE2oG)*zHgK>E^ZyJ+|3>&wDTpeYrSSLlCZ~V}R461*TH?&U~SHG9xr5<4)
zLBvHCx1uqnR(>H?HtL__-qzed53n%ms!Kw9ycIWAzQ>x05&Js6U}FL)w6f^jdouczT_+`?;bZ=0)(k&6Y;SDL>!4HCuf(
zZhJkmhxU?p&Cqftf)n1&n@P3Y;bAh5y;@5j4O$tm3RqQV7*){QGfvvoqcjJ^D-6y|
zY0t&c%;`xO$LhKl57kL2lO3+imp-7ILvva|UaUiuA)e;e?ui+zVOOpJDh=iIOHsKVJ^Xj{nH
zL5nfdl&h&*FKqv;yOz$Mqp0R?*zF)Kw`ZKM|D35d=*`I>QoMQDMtQiW;iiT#Ys5!-
zOvd#wqg;{7%-Le;@G|&u(*s53kfAQ+nK4|D&Q@IiQ<-~3=kvdhU#(wg({_QT@E^6^
zpAh1291TtS6@YE-+KDrnD~tLqVTYTetzUhvA}
z)SSX4&86e+b6Vs(CX==-)>Xtc3!=uGLvgF#`4aJ9THuWRvl;2B*5|fZzvu;uJbW>~&YbvC(0<=1HW63BIL;$S3Y=MPb7yt}U$%V~
zeCGSuNmYzbv(
zNbkK%uYpZ@_51K|6{H=~oQn~&q5U6<6ocL)8wsJ&>U*z|M^<2FY-B+c^{TZTDAgBx
zuBzJJuD2J5@DcbOUrtM1ims>l5;Qi~2qCpLi@-8O2RE)5+uiikYUF1breSB_D?qqM
zf!pmtCU1M@c$j`w`T7_w?|sMd%*4-_L8J?k2fW*!>I~V7lqWbFKmQ
zv`%jp+`>CT4(7d>H~e(w4?!~JENj45aZdPS9S*q`)L&J%O7S6p1OOH8Qmv
zUC7pa*eWAMMIYl_*x%DD|BUUb%5Tvbrq?BEUC2Txe~gPGk#L6@g7eGmGmW@)H8Ixs
zcu<(N76&kDA|4!s>2(Ql&82@am>mt@Kyq!V7((G9tfpS0=`>ChVfq^2sn7`B@H!R^
z-N$obxcy$y1U+d;L4G*!S5xL{Xta|MjDX8aEv%c1WpGd5W}Q
zB4VDD5zZ*gY_020;E*{BjMq({bu}NY=7tai&zzoC_gTREQ5|K+s3vxZQZR5;v0jU}
z7L}}qJF7@4+pEwiZ^8?e_jNFqf&ijun1d!^rcqAOIEb+H;#PT6)-@!8W5Vd~9j?c)
zIep~9u&u3kyH2f!hnT!r+!^h&+a|iql6uKBF
zs5p)&%+e2_^Z%Qcp?C8~G4qJ^HPJSE#e-pI8j7_{opNTndNJCM4xi79*oxg4)b&YG
zU%I0lYgXb|R^6+3Nl8rp`i9lG0_Srp#qsC$inYSQWsL>4(88wjIY^4
zmyQ%1N2`|waR=T*<-HS5pT14%yXVo;)0-ytNbMLMI|m0ER1Qg`o|SzVH*d!I`KVPU
z-gjBuOThEb>{Is=H&RN3joRwfwF|dsF_kP-osIF1uW@_}7&_
z(ot7#VFojemW7}(ues+EvrdM{zA8QEz1^-6)!=1iv5
zxzjzYpasGP_wEih&c-*oj#mkx)q!2Fs9bo6YRlgSH?|hRca25A8m0Rce7Z{{nAQ%e
zA}gJCOE~Q5w;ZADRNU`cv!K<*skV$4vVP*EdT*^1s(0wDMAED4$gt|@4_f4X=D9r)
zGIY`Chij%*T&YxCkH{H=(!regJeTIW`}3~u9S7wjk3Z2jxyGG;5*G~P8P3r2L>jH(
z(QHDjOEVuV#kt+Q?>ip*D!;xyUpyi8_C4uKpOMv-v}uR3Z8ocCNcl2PlGN682bRYD
zfr4C`fBsMAq3@H9Umij@hht$unCizH41Rv&(%PZ=fulb@-Hz%sOucxKT3FW`+^9U-
zSN4Uxywfs#yFj}`_hEe9k=da)Da~*&qo)NAUBUmT_+KAzwWb@_S3bErys-HLw{pi%CIPd8#HudTt|HX69lN(1=>l6rYd
zoDr=XHZ8M0e{B`{^v|8RZ`;T^xM)x6yPDrvW@Q=D^NvqfvsLNPd!E>0t?#v6sLy>W
ze}hBWH?4&MNK9gApC+thN2c^VwaycH5sfae+E$QS$SIBjz=N)q%aH9t?RC8tT;;Hv
zRFW^^iLLGM>(CjF_<)EQaZ2!jwzeV{ouz}rwhl5c^hV8^R_kIn;&{_?se2ky5FOLtsT
ziAWqxQgkrJVdDD|LIVZ>!U@2hJD1&WpQO*IZ~`dgGQ*BqUT;%sI(s~Jqo$&CuCM@_
zYW0OTo7wX(0Nw@9DW&lP&=(EKE!RB#a)pEjQ=TevXqz)fJFT=Ma8d?JL}@K~WZosl
zGY2MY+Ytu*<#Vwj@=8vWilrWCZTWEp4yzUkB1x9YFpwODqg~`52hcBNP_1JR4z$M
zCF%*_CQbTvoVW($WiSdE)QE(Dok9g}H03fc9aTqocCI4VA7LP(A2Fly%js;ad_Qb5
zBRN;K8~$rt!TZ3FgC1#}moqM1Q`#U-{)y=*0aTdWXSzUdeo>+A&xJVJ_4nhH^flmoMVzA&vF)VVWU4Nx+HBQ--QtcZE9%g;qE`=E}6Vp`q%w153?+i$*a&ej}#+
zTrWz@_fYadRfg8SF3m#wG(tj(gGdB=1&F=k6Mo)HMop@xZmSv$!^9nYEn7TPw
zgH@Wa`x{C7*EDQZyNnSMfoH{Z<-G}C`V?Q{Y@zwAf#MZ
z^h4a$2=pV0@J`mnu#dxrIuY>})HP)na;53(18J(Z65V#+n6%*q(?12|<$jX#>9d-B
zdb9jPTQyzj1bDW|kda1VEOLVvbE}IV!Ql2dgk$SY(X7}H@tuxy>K+YN?RA6-lMa0y
zt@;jsXn|rlgZnQm^L-+@7E|(l;5L&x_aNm
zOHj%>dMSqXTSB(iXnQHVCKScy>N#5jHuom+f%<$Y535w=RXN4nC>rieDKK_a7As%s
zd7v~hP*w4&GzZPO&iu?LRUo0JLt(7HW%ZV4+qb<}+N*v9PUSf4bCXV&$B!OeQK<bs{;1pi$WVU#3Nz
zBNs!W@iebi1DM*LUp?QlM}~j?R#GWgRr_My;WJt`%9e1Sxm0VSPn&xr``wXA`RME@
z_xz2@%GyyosUD2mAml}JjoFpz`E|-4waFb&uB|*CNql$9*r2G8L_r~2)eWt87N-d9uzI498G{J!~0kg>;
zEBYPxl!Px8alg74zfn>r6g;yRbN#tXH~$;@(A26|$ZIz>B&|a3KzZW>S_eY-{EC|Q
zI8x%HFJD+Md^)mZv-^}^;3%4;-7i$IZh4=!db?e8y-(rT3G(Ag!_^g^=Xpu9MRx@T
z_17F-o^_jDt$DfK{cvHq-jiE&OCmZ*(^dK|DPY3jGu}pKgD=DJ(FBWt3zrA8C#}qoC?D?*%M)Q;R
zme&1O^eH$K7cSqUf^;dZB~sy>9F37+z!ZDAerc<;ktu>__TU!Hi+w&~Yq{4lebB^K
zEwNAZOr87Oa|7rU>0BS?I0ehsi(rhI|7wkU5}UPe`LG6PEtpFWe5E0=vAyi6HS5;Z<(S{QLaE!vU3GGz
zA9I`RyHW(GEdv~L{l9mEe?`6C->V+&6R2FfRoj^%{H?U^dWluXc<_&B_$ee`jEodl
zerf?hNC`96;G*0*Z_`$C_J#rD3P$LO5YicUUGnE7ZSs1;A6H4$Ud-L$6Tw?GyQ`=r^iYAL**i|mIzUKqID
z3`-h=Evbaq-=L&HbNa~Hg$YWA>ale#*ku%D;uD{42#c(}1~a+t9-N(z5_+^geE)-z!sm)m?l=f{WNT6KTWoDpFfrbl_Wbe6l8_G1w`=HBf>
zY+dZR{RQn>49b(n_ETw?Uno(^@E=@;QZN8xK*t0OqsMsqiedAMYgz>aAR?~Lq@m);
z77je%ASr!UZeZBGx=`6945yBWtC)G`FPKBsfojP)o0z((Lh+f-WB%=sOt>A@ZO(EN
zQPG_hReFqmKU?vl7>p9x&z3LT31j%)gxHi`EC{r8a%5LpSzv@(IAO->IcqvZb)O09
z`wWeEHM8fvqh6pNYPHX_=+h{$i_6*1z1>W;y{@AzB$#Vh?;>qZ=b_cVqGP(iJ>33R
zLn?hZG-EgUM}=m%SIqmGpP$|u($W;;0`GXrsD)B_FOP->7c8^84HKb;Vj|*8-R4dZ
zCFz|at=za9QeCW~7uM28JrU1`%QG3U}G>R@=&N$=w|M7Iy0a0~Ndyx_)3{V;sq(fjyfdy2$yFqD?T)GxSL6DSQy1S$i
zq?=`l1*B8DJJ;`m@9+EXZrl?y&&;W3=6G%wv9i0G7b`TJ7OmKjQAAqB-N*aPOcb5=
z(W^y~|3W>PTPsmPBFI?!sl5@UIhGUcY?+^u0P)fCr6%RExxPS!58L}OcU!t(Cb)|9
zA#oDT$A`f#+4+6>m3BfFUx*nQ@6r(_^a!&&;D91@L&Xn9kuPn+;%8!&%3A1uLI{o4
zFP4D0dyqcBW!3utLgb9RX!v1C9
zB|-C$>R*r~!r)%RE0P^FA3%Fy_#7^F9Yli;hc^_#_L%@454}e`&4SvIVZ!RHC+9Lc
znk;+A?KsbcrhzGoQ)sMOlEq}!bCq>kg>3G7aq8hw-YdZ>4DBRI@>o`T5Y~5Z5ao~w
z-Gq^z6pk2jL7wjsVPJ60b!0BDw4O0*0oKUe_t%uS%pj?g5r!F++MkxOLpc1}w3D
zI750%VJ22?e?j5e;nx+gy}T)D)K49Na^W*~#WaJLqr%5kN_JD`>%qjX#q@9D0HCSD$P=5ma!_zRk=
z1~@#Gkxxujp?tHrqJ*@#wZ=~x6esay&7E#HwU&y3dnFe2
zn>cgGvV|}^bfctEXMhwF(bqL+O5kESSYOfY|KR21F<2w!0muc}lORc`M$?Zf*1w>x
zn;(G^!?%hh?RZCgIDwbG6G&mV7mnr!xN{~Q6=uqy#v`pct}pHOa;R8THf#XmQ4`Ru
zwwM@lcP;#yb-72tVFCOXxKS~!DiwXrccu#Y;cV}4B7L|EP;0)ZN5D-Xf{w2UA;{sV
zfw($=q)4mIfEG6UR}3Jj!j`JU%|A6~>N5tdj0rggM>&>)tMF>@jMPzeJV2q9o4R5o
zx6Np@$?5(J$^oh#^(|cK3yJOE8;GXdxn`a_vCYvzeAJDM1T=J|Lre
zGt50B9NoBEheVfVa|_~@9^r-+vVf+6hM3I6T=kSE1h
zp<+{1(2san)ptXDTMPHCgYk)55hevOq~#nr`g};yHQ^@x)cnqJ1hpZH_C*&RR
z0t~h}0yJ@^OcV0eeb+6Yc2^0ISr9`MgBzbw1Xx;A&c7
z(*${hkgh!Pn%izKy)s$O;Y7P>cLerD#H6)@mM&p_Xhnvo_xBa^h$Z}Mr_Bn@381ui
zCxn#ul%?-qPzg|;HerA9O1FU7roy2K?ux(_^Z1EIfh2DQ%?+$%zz9hSoymVtW&BZF
zq{`LPLU5sSULw3PWm$9HrrUQ5RLK*UoM{So$?FQh0=I-^IyD(e*QFSuNO?@wCnMHv
z*dd#VurJR>oM{%T<8G{8rW
zo29uuIjFh$Axlsp1F(#y8}}D8NM>f~YFZD74F_Yf(qx$D0c2^+?(*a>XhE5ZLxuLm
zEbw7&K~a>+{fB?@-0DHDdkGFy15&}mIXr84^ONWZ&jTN8%cdL2&_{G*{h*1jy3bvs
zV)c9Y81pZP{m>j;2e?J287cg0`0X3wQtu#K^1p={3C}y_bpW}BpPl{_eKNPwGn;>E
zP#tt--gOj2=`MdJ_$kaR(Ad0NCWwNEDIQOUND$U>K}{AIf6o=HbfVP5Bf;Okh
zb{yAxa|_bf39#|4gYa8)c9Y>IKK~>CJXYaLLGOCa+2TK8DUiElhS_A(+!plcp{iH>
zpM1IR#!(sp$*|NLDVzZ)P3BV;O0;x9FTnu!zoT}T1!Nj=AK~z+a=qkJR_>_G`e*cj
zE2KUA583G*cXL;yuOx{N!Jk1yBqo+R{*+afz@F8udmxO>vBBl^A!kzr@(_NJz;Eb4Mf?iP6rCmLzESDybo
z7ZaE~MnhV3IZ86w{`F{P)`ov-h5SFawJM8J)cpqua_ry~&m$ycbuw|KR{@Wf#PyOx
zna1OPhAU{B*6__8b_1R#58omg_LBaBQnRU@{FC-I0h#;{8LF@fyPlPQ=J)z}jL>?}
zv;vdd55iR*=%vWj(lxd6zacAiqCSXU3sCG$hb&$c^t}jA$a~c7&TxfRcd~^0E&abI
z6w9%?=UyHC&rh?yCT6dssB9k1a|N16%o}{kI86b3
zeb#^NBZ=tE(119NoYomOYCM)l;jPRXw%&{yt|uDlDBXVCYe&1iv_{pz>=hA*ByvRo
zKa5168!$kAUA%xP)ZF;?mn~wRQkx9q=krPRUXs*YI0&7oCuFO6GIUb^lI?
zhtMN8$ZE5j_;30^LUUq}<#q|~n(G5v_lWsCG({(xJF2CVxo6n<8TZMJ)`5|kafF9;
zS@#AG0KYpZ&C-P#JYb;#9jz@imqmrk{=){-@G+~&B;w!HfV%OX-!g6~jf{r7BI}HB
z!S4}g_9oMRLv%8?n&G+g?X%JoGj~@?|E}RUuPk%^!qA+J&qlZP02*kT@Cd`b0Jq&t
zCzPI;DjlR8zvy{JIsm&@R&Sey^JMlvO;t?lO)>I46mnm0ltE`HJ#{T>d!4t8RvSFv
zds%y-dUrMDs3pQ-^3#siVQN}70Z0B-0q*>s<%|H8r544O>@Ovc5x6vHz=|>@!+*qI
zrj61xBE&2X5k-o7l=FZyT*ekxeI)}eD!tMT3r;eLcCs6ePcu)c{QQ3XWgbSX>VV>s
ziu>@A?UGy<^g^{d0*_J+81Y1u8s%RPKv7G3d3Qd!3ymBOy#vV&mr+*HpKjzH<$>#_h
zm`nIThXg*Pp@LZBTNpN#
zjWJyWhXRb4v}(J{UK$U=lg*+mSC0zPY)HZLiehhqvU`RtDbgV^0=DJ@VtEhCc;R?t
z^BP78g42i;^3QP9s9F>zMeUl^TX87-Q%oO?MdIc3H51xv26~~cu97>J{p|bQjLt~K
zeEyh;`jzZQQFBKHg}zs6z9wE((L?WI;G(tk{&ewV>&hfl4hUgs%A-6Mmp(z}3p>FN_5^Y-y^Mtb
zX$eq-6YqfrJTKIw$#Z1rlO@D*DH2G0POLKV!*$%`r^n>1-mW`vi{KSwCv=nY#OHN|
zjoLV}2xK~0xbJk`a|n(xiz7wyNK5AOm=Y7lbb*~!+360cF+Y^BC`f_OF)3O3tHqY@
zzT;TKfraLiSnCM!Rmc~YSxRmS0&9E>a?=(emvigDH?dTkgICN2W8`Sut5#bNfIV;B
z-`+cP*~I<3@3Aw<&7#hoJit~uw+!q@B!}84YDlpjG*8A(8>RS~-_Uf3mgoD_91M>v
z2u1!KMc=u%xp(r3aQ_zKRs^-^+a_Es!B8XKY`jSV|nkHIRvwS_9xHa2XBOyDRJ{52O-r=1aGqVLJVt!XD0*rZeo~Uf&!-BTGmE=4S6{2SdHNCl
zBGvcxi1J%rL&2OPcRsH0Lb&3#z8b8rf6gDC7WkbAqGPVW6n0Gj*$!20Z2$ci@nd3sU!0SAPUmivSp=#I^UyoP@N#RgzB)UF-4vKBA&~8z8r^;{7)xl#AHPo0wOyBm2LVXmn
zx?^_*mjcx=)KbN2@ftFV(uxI93B+n}EIWV;ntJZK(rh%Lr5a3$)rFki*#b
zAU?1{VZJ$9tL
zN*JT{9wXAYJ0Ys&%=&~e&TMbj9Hm!#YV{Zi8dkB1NMd-8RFh?5z&fpi~`RFmt
z`T0$a_i`lrnR2M+__A5<{mCBXx!Ik$?Q@p~s%LQpSSMogB>Iv^B6Eqg2-HW9-wDm!
z$^oaez&tU(9DQC?Cc!zItk7%;XaM)c3NTf`1h?dGXrGt7yrLX~DPWUz8ARXVfLU%B
zb~rEr0blUAOI1}`i@KZIV+DwF{UhPnD3su@JWh1ns|(Iz8yfY|+`34D_7I_%k$q2>J^;($0zrbc`Q8cERLRB|0O^g;{N+8R_-I=FReae`?bEGtn>-
zYo&ZxKpiXK)dNy$MlhV@09zsFH!dyl(46N5?F0EI@AMj+h2N$g-%MA{qBrWpm2V*l
zu^h12efR0l?zX;M_}STwR%s^dQy}BOJk}eYU-__0M_ggr$aAEO{EZr_Jf`-h8#E^+
z8JSSMTV*0Fw%Hzq@3!a!(G8+qs}5tmbYy&TWD@39<|BEiAOv|IX|VG
z237^$8U+%sPr)i)PW=R#-aw02k8O4hDSEbdvoa>&u*Hw+7_$*;>ucE~IbAhs+Cg7(zY
ziIw~5b=_N6Yj4u8b7Zu2k7g@$FKeKfl7p;o!ERSQ0X_y^p=1|v+Hh3
z1p`kBljApTy29UR6^tJRx0=Eq_SRH`92^71TH@pvz>uh>(}|+(ZbCs!#n+rQ#RSjl
z+%_)q*Kh2=Lhx6CrbS&MWEY+xCW0DBIr=VYL7=OSd1u4;2C3f)H|i#BZ@sYj!cS_(
zm!df=aC0@3B+fr1hvseEyL%~@3HTph>~LaE)euTlW2YW^1myx4%I#PHcuQM1SEZ&X
zWyV9Pwx0Nf_>`|wCGWLjnkmQMEW`lQ_yo4UARz{T5=5YjWlEr__AuW%!Cn;2y)KVN
zp`^)bBW^IN-1)&U4Xu_IQM;*pKyDTYXwmKREwBUPH3F$TW+gfbg6vkPljhH>VB5A9
zbiW(PxAOKG0vw(tPHsL7*$&8{z{F@N?KJC|Jx10~3{SwyHf&$g>~Tw9=NI^=RsjOH
zLGwsHqa-JiJI;652(TnDRO=+@pF5pM+n6ljJh}0s+Py_H@0gG>F=dFCqg7l@`-gnj
zSK!pii&DcX`S8=pJmzvT24cT&rVd?I&*VnPOY$doZUxC(TnN#v`vIBai6^41sgiOv
z2Kj&q;s%NfmS}F~65veD(L1Z#+|ViaqGr(zM@wx5F{-@B;Lg%Qr>8giO}(xtWVrgJ
z7=DT{*%s)rwR8xEzqxtA=|XS9Q4An16T_
z^79FwtNkz2B39P<<>n>c{oM9a}UPYBS$B;swj9G0+xpXasizv&s8GRC$-f0%r$5J9*+Ei@k%)
zeRGgmWbGfy)odvc10C9_W8SMZtDBYq-fO3v-uxksErmcLQ0Rz+o_laHZQ|KS^WkVd
zeqlx!Q5Jol24f*k}_(k5P*Du?*Nlg0fa5n?oy9vA8%oads=
zH>(_~&jP|8uoNrh5h^PlkXIc-COwcQ`;A%TTi>1L_loMcU)GiLyMXAgXXL$d6VH2}
zMvi4ob@dYPJd~!-xj!LqvJF*>7`#h2n$0SKEmrgAh)3`fe}_4}&fB1ak`axO>lB|V
zd7^$vohDM`nI_en60CG-%HzT^qNr4l0t{06qPG$bdWXL^K5AdJBO!-lwVf8
zS4*-jIp-e8Dy{uVWSfvLR1NHUqw5{yYjel+wzm8S|Bj*WB(5k}0(r*?#g+Rg#~8%u
zjGh`6dqP5`(H(o~M?+D!$6QO9(GIaL>a
zy5hdpgLRaJSq)=W!PrCyxP2TKL-6GJ5kmE!etGqawj9`K&ixA#wOXy4C2&e1W}amz
z$3=UjUSkxP@0E|7eFu21(XPvXLEMu46n!C&q~{51m#aD*t!mr3hgynszywoRJl5`AvaU$S{EyHDII^c&1AP01z06^U@n{J`0bG)3|>
zPk1q-rqGWrZ5-d5yDr>^30kP(VHL03?Zw3fK_lAoO0`j5?t6xdCnfOk_HXwA>gA>;
zkVZ=|Af;8;HR3(i58Yp6it{aDu#0H;^pTXv)0tL
zlVV*!YU5v%(jvy|OL0T_;C#BJ5@3jDv0C3cI+{LP7Ny_}8y&KY6(O)A*f`Z0z1p)X
zyW3Q;z4XmV^%2Z{rD+cv2#o_)o?WUmpXvP=ckWl+8@94}0sJu4D=?`b
zE|G;r}%eHEWfcC49
zK)RQl#^70geX~fckF6H%{>*ropv8tseZd9V4=^Op7OawY`K;VCW$eW8LLp}Sq|%&H
z#Z6nfOKt2IuxUms??dH=Yp{n?wb+Djt@&fdLL*`tX#=$=&m_|~W-cjm#1Nu%WN9WB
zk-5+uG{o1RTd-?a5~Si9L~F7b5Ike0t3u78$aiNqWWi
z6}Ix~J;Fg;EABNWN9mlTaIe8T%jUs^n5G`eJ^aF!Q<4TaR%2gr92*rZ1pvO-vT-)I
zkiAuuk+@INFp-bta?NW__*ZUoEcNd_0vg?GmPN0iBgEYH7}+8-!fW&w!FS5e739H}
zgCGIo$0@Is2ynDQ!Uv)WP}BHEl&aDD{-OdF{7ZR4!!*0(_R3)}LG!YePa0W2T|qk0
z`@@+A$(GuFX^}9~z~yLdL?Vkt6DzHLac
z7eSB|`F{*>fyF3=8%VDsz}A5>sxt3jUk!*ygm{)#_f{f)c*i^$+5O%xHd*un_
z45Da>Tjbw0RFq^PmMg+;aF1~R+95IP5ynh3iMzxRbWHI6nC7mPtrt(pyBFdqYLuk$
z9pI0hT<7z=uIBgx#p>aXzsNt+DxbtuA5R%7HlIherce$68Fz%MD~fe2B3l#Ny+8pWRB${Erle>(%d~T
zgup7!)vj>;>BTncAy2!D%gD>dx`3B#w2Dl9UzAbI2d{&VY>Yca==Yy|dpWurSmG3_
z+h*U9XZe)e^3^+Ilm5E|_f6ubUVl!DrMsFS&ZbEEeOFm&rI2Fw8aSD0B%m#txrvyJl6PZXhG68w<9WnS}_TZPt8gUy2Z{&)~Lh?R#T$N;Oc
zY_dAe^)4n~G9GQO7iDbt^SbkQZn6?je_7@w@&A_K(o2LGqVfvfKvnPwDc~^DPWL<%
zWpd{?D~Cilu*v=w*#j2z7Z}Ot0khR-yOuQym^5oQ2rpE`HhVhU(n2f0U{YPSKxqD#xY-xgXS(y(uUmay{1~jd
zpEx7AwLd-OejxwcN%>D*=!w&$I~juBBjFt>Dse^gFDOv5|B1-my(cmA+YBAQcu~8?
zf-SWNMin)Zlhp^L0|pYxQ7wygbHw2RwbhCkRBy|s*$LDCKu6w-J>=hwP|Wtu&9-)(
zOl^~Ak+b_zUEywAFr)pn`imd@e#eK%bp5mjX?750WLRx!q6lPm`t2mnmwZVqkK}A$
z_+L;@0KXLc&$rJGq?nG9l{9bQ@oUb;_K{y$x_+#WE7Z*8M`e2vokf+byG)M7LKKzwu(zO&g@5B}u7CA-1Ky8q>=h;e9PoiEKZRlk&~
zr6$74*ZRV+1(UO1Q$A5SwH6u9Esb@QUH49zQsEkF#1B!yr{RyzdO4o1p=tJz?E)t{
zXa2ID0rgJjHXNZSwAvZw=dPV)%+Sv?3+df%LLyYdae}U%*1$4BHkIqFuX&bnkKjnh
z?i-s=A9#HwBT$;Fj#fZiQfCZgzU^@^kDOj0XOe0&?x*e@A*#hRO$>16W0`+W<^
z=d(_XLdie_-o()2jaNzg>*66qI&zFy!#h;iI4)0%pEoZbrP;pONFpA`JLp0WIGEFM+{{_h?0;_+S@0=+XR7bpE
zMItL7T9na{lNR~n#-G-AkGxlnf1CKhFSwPiQ_Y8+?XV?*+*2nf@cb|W^&aIv)0H9Q
z{7Ab9%-LVwdk0jq+SS9xbpid;{E8xrip-3MR|)`21Gm`Qb1@kr7R&+Cvh=uauRjZ(
zrC=%^@BabPE3*#dq6C1|d+5{Jxzpy_x=`aM+u5bsKKAZO#A0Izh
zk8rEke|%}SHT`l*H}UHgpG`&oBOBJ-5h4HJz58cg?{mzuIvWb*>avO(
zzM7Tkc2mK?t4xYR7&cxfI@4xM0Ey3IG208FLYf*tN}(??5yobNgzBgO{H9P>ASnru
z_$Cxw%-*I@Tjj424vFk4wqEOc8vYlg2Q1bH
z2{5NS3F_X7@cXSRGc}VIzUnVeQIx^73AY{=0bRWtt8}aSiCz9m_EG-1&MuW6}-B@KYy{RO?9voh!y0v4s`6hwgNJ2Q!R+
zK`9OrQx$(f!gr}cWo@`;T8Gma4dWC_F5S0LK*n^p$L%6G7EjyngDw@WQ{L_)dnsSp
zeBP#=EwMCsR1P6xZ_qAyL#t-}OHGi%ohCse3|zh*5#MDAm+tEo0^RiipYdBS)!C
zq|T*`yvLmKUX#CbBlSRU?}+^9?)$P&7w-ug#7UJSbE5Zj`>&TCpC*PyYaa`gMdzzU
z!-r@14w$rk`aFu*7B3aIuEo#RHSpLI_``d(ckZV-)G*kCl88QzBU0GUTo;kJ({HR7
zZA82Ub-&C#8u%$&;Z;xeuO~lHm2<>1tv@E%l2I;`
za`mC@8f#m0FWx`5i-~_WFzAN#IHh<^^Z3pDT4HO|8BG52!<6p2poc+F$P|s&fvwrS
zLz#A36G9R74##RA^1#l%Jg<8{Mv9#f%Ivhi9Ed|%?VQP`oFZfCUSz$EQBr&s0!K*Z
zulM0f4C>WaqHPD}R!?bI&c>T3PusTDofIFOzi<$&sdftR;u9h_R?&n@(&T?r+wt#LwH}{OWvtI
zIyKJOFxbmQhmaua`b;zsQAAraZy)vqL5_?vI+aZ^2iyw=W@k}<1ccPj-iN(G&<8bE
z3Fo%WVeKA&GrZf&x|51X@3(it^sE`WUR*9}F3wA~GAc{X7c?*=N_ZGl8rk2d*~EUF9Yor~=3H}B6*
ze~Nsj(qiu$dt`uDsKb+-y!*A}O2EDFY(&n6i^=p?ignC=+lWuH{D*>+pkG-bYFpks
ztZV`*p>Jz;ZRbjg&Y!K>Piz)uZRW^Yj4Az)D*rxfU~lsF5>vLP7Vd5379pIENSm7lKrvr
z1#2d13-D%7ai%K`H><7M<1j7qENc#w7ow`5B?
zLa=L=>b&^`m3|&f%7oxgg~NetC&Q0Zt=^+t8T_Rj1&8mvPP*p?L?6X`28Sq#=9&w^
z#UM$H?{bW6`JS7JV32A;K#|5!VoAQ%^s%K>%f^}B;jE`bfhP-
z^fDj{D};2v(qRBwIwBMP0>qs9Uc)P`uM6Bhu`Ro2trNHab!$>8ul@AL&e$yKdCW(0
zdb7AbTsqt-q@mSp`I*CB?AX|76_xGD>7}O=xkjC!jg);
zYQMBA(y!L=<_62EZfedPz9g)aH$*Qq%+xV)StT4ojNqqO-lkW|CA#lip~Qxht{M^N
zoZ76s;xEO?iCz;l#CFn>?T)4A+9>Aa`US*>zgtC1wi`YWqFQLWYt0}&?5xeh^39zt
zVAHumG;cp5_r2Y(tku-_n+6LDFkk9N`=8biCe~*eK8+~J@6QVAkV=96_|7HQVPP6b
z?rUm~@*wZKsr&_L)Ovo)3Ets@>;L@C)}mY&fY*FHAZ)!}`lWNI3Q0737A(v`OF0XWP{~LKGTLTxcEY?oJo(BnOL;keW*hUYirkYk5LOo*U4bqy-RDm9JkDV-7mhn
z1=?}X^6j{HuLng9^GOa%+r96L0gI9_zs#0=UFna$dL0F<)?8BV%?}@O*5IaCZ^^>$
zow=&-A?EzOShCjnE=;q#PW<3g?VR5t9=LyyzW=P%hMzWs`n)t=g#Z4GWS1*7eZ4Nf
zM0VA8ir4Lp4~wMAeGi^P`1(>D;KWK5Lc;vY4YX5+zpkG~E;Y}4dn$=;FmdUIj0E<&
z?<%Y!f}%nm%U`IRE=D;93;gumidjnId2zG}|LoM|q4TLoIB_`o>Nip*qy(3T)+-aZ
z!;u63^&siB_d4wdMIlrmXxTxuh|_&Jg%K1|MN9I`WYEVjUg;HfP@5`}QUy4@&b}Xp
zB97>6-OGf#XdQtMJp4PrcLXR0)dN-(j+-9yUA=Ing&dp{0jJBpz*Q-B?U2Q&I>^x_
zF535qARfDnGh~=U=yAvWFxioCz2ZA%iK)fxZavupf+H>g=U*`8?5XNidocYG^fL{Q
z6=wWHlsFM7cQajtL!Yr?)8f$ZTJ!FfJpyj&!N3%WZk|}CR0&YAh-nrl`xRXidmu2((c1xk|3d@oLxwVfKE4k-(C>;KZ^W{^ywd
z>x$hhQBuYA(aW4Y%|(9C?-H~Q=PCWRvY-S)Cyqa8VTc*;iJcs$J=bG0e@jEp=41e9Y(qT-W8ejRcRL0}KZyj=`0*yxp`DsLq5fG%YXC8KSDA``@m5&`3BUbyEo
zoH&N^4uN0BQIkI$`IJeMqExn4LC2d?piXbA=9V=Uvfe*=W%r2pk&U`yejS_-xg*>P
zpW8QRg8$@?D+oTK7q;s6B9vDb6`dI?ZWkjvE^)6Yxm$&&!CwL_7JPYPf8|z3I>L^~
z=h?m@i#>?^(bkF&LSX$jDJ)G(xu5QN&n0Y`=GPalo^$s`x?EdL8yO4BzrpL??9hML
z-OV$he8g`lDR!wKN~wBPv5kh28)%s&2NdaT*~TUO9Y^2s`Dl|#;hv3)$;vH-qp;Du
zMqPKP2@o!Pc$`KOZ{J=cl
z4_2QK#5@m#%{7Lo^3h~tp@|2ex|y+WCZxM~2G7)p_u0M?ov*=;a7w(GgjQ;VxZ2%<
z5#f*q$OWbva=}!^=YSI$p}^gPc4n(Wom6x=+jh`}jt&K?o4$??PbblHZ16~3mA8vF
zCy{?NRd>XmzF*Piv6J_UbzjmSyt!>p@?AC?Zt*-tt&=Wx0;jdzSBr&_p{#^Vg!L@U
zGxdp~^}{Y#=fyRlZwXq_2Wb2G&cet}5GV=5;6saC)bn=xgc&FP^3I5@+jFqIcH$
z1CeQUvUP?Qq2i@Gz1R@OE}a8{-=qZxoKytXeYM_x$93=MrFUITmb(FY
z%I3!0!xfg$dP`^re`5Z8(fhjWG|*{E$*H%W5+l|^
z=cy{g?I@^Dr^uT-gnoV&K7VN=slOi=Xd1h!k23z$IyA}qw%S)$lJfAAM|X$Jvn{UK
znAKnS`?!HLZ90K|URLzFcz*R2DI{|*s}|Xbw~?H^B9c_KwxcV?VbRykA!DI>TPY&8
zdPwAmK2mNkH`I8q<}=SW;qV=fs#@BrONoWA#cg&mpbfeB`>Ar{wVQ?yuP{qD#?Ty9
z`%f}6H*lr=W#QOmkK0xF8}dnlyi3Bk!{fp~YIf6$y9p_A4~`NB7^^(|<6?cWH4goK
zrMi#X_MuOC&-}~Bgd^$qRk~)0r;aZXWo`O4=f0L)y=_AIl=}w!{dZS`#b0rC#Op@F^>~h-vL-C@yzw94|ORzB&U}%nEk&K|^$PuNd*_++{NG8aT8d
zjrpoDU_rGLSoE0^e%eU02njq2Cvl^;$d36a#AjFkL1}rqdsvp8*im9d9hrvkx)^>W
zkP|fpKA<7nDDxZX1RM)J_jE@m{R0`ASDTb7u8Q0qdp+(56eidJ5wd!j5Ans1k#8Dc~NCg8o{wYjH^$3)z?7Mcsp6I#R
zwVl+nm#@fy&mSvMztz@;Tl%Qh3&9FlLK}Q|4&(Jk6d6E6y~>o9dlZ?0Hx_|T6#
zf4k4dp;qtt75vAfTC(L}bU-G*bGvT&j{WNo<#?OHIPwCblsw#FP@7qWB~Ab1OySVi
zznDnz_Ys&M4g|@${bLrBw3hso4|~$S5iTbM%PmEUA%~MPA$(RCiB@gshxtVRZC;t!
z&J;?nh)_q-9NunbogH9f^Q6CwiK$x2#d79Wr_bYx
z{ZxNVnFh~9B0@S&dB-84_q_wd+{}E4kcTL<29}i<86R*3R${_}N$XVQUrz0b%)vs@
zk5W5S4Z}&@64+Aqv$ei6UPT1Rw}>6Oe(a)g<=-}Vyg1|8THn+WD%q~u!{kS8m$
z$@{Q>h_m~kZwYsLJlH*HDO=`;hyZw4YNLJS*orPI_H+|%Ufff9#W1$3sqkw!XP8wf
zA-n$2-~?^s|0jqn_-!Im1&BlUpwMU{U8t*zYMU&H4PB6a|0Gi`sBG{>^&dEs6tI^W
zF~=>{wkn{)J5NMr+yGVHdf$sWNMP;FaMe&8@)0qR$f+TWv@6onU3>aSUz;To>ql<%
zPLk0NlWpOzJ=8H_J_b@9&t{Uy^-Q1$<@QO(TAS`A_|u({Pbq&v*<@tLY1FMQ*_6K6
z5SlOa(;SUhWmuS%gw}>qq(5O73w&r_Yf|&!YA3}rAoX4a5KWeWz?4-b#r{p88L1se
zsa}g-%O$~`{ZxWf+PmIuwY#@|GTCraaTcy_LTIxiIkA-vlbn=`GCHBaI4%j8S_;T7
zn4Z?XdRy+VKf*2rF?}X#v)_6hIq0*@IM04BWl3n65RK`N$*v1#Wq!q
z+OeB_BRJ?_bts^W^#4xu#y|~6cO|=JyF=HekQ>)vK!J%RC3#*LCN*@$z1Rp*i|^pg
z%_(|PKoWNTcI}J~pQ9JAr@8diCB1^I>!yO)Gv^#!BPcwESgw#aF7h}q;1|0aZu6u<
zV$O_q&tlI}ERnI$;5Sao+8v`nDEPNs!rQMn^MnrCaE=bcdtSl-Hbw5HtN=``xHyH_
z5vvDZo>Z3}_OUQ?(;~Sa#p7D#D60A$a>OeF(~D3h+F)s|E%#!5HdC91rc&d9ouCey6@UrMIYXT#2Wh&
z5>skQ7WxdO(ClkO&)ylU{8sA)rVV3+-~TcB>0JBwLEnq5B-jY=WTtNsr{Rl$Re0oG
zTmtFL5$$3%c)0%6xZRt~@$Cjk&RMAG-e})OHKU5CZThPxJ44-m;e#=@p5#Y4X9=E5
zmYI8{-#Frcl$4^16W}SE-hv{%x53gb)6-W6Hc0vg8*k{F!{h93$F`@8vy%*i7uJer
zr3>UU(0uCLQ*PKAPWg|Ha($wJX7cn^w3gzH
z-9D2P3_P_G+=IjrurQuuGe3AJeMHj>cXbAHg`3yyy9R(u124=!A5BegFbHOO#I%vZ
zdA{DQCPmvdh%rRAkc_znE{R0)h3y`{CSdN;tduwK7H?fVHpfqKko)s+#QvOkA;6Jk
z#RWvU1U{Q1?ch)?UMkQT8nJ6W2@ldllcGL?Lutht(Lo@
zn|Xw1iy=O%xjv-hv3^%x7tQ20TV?zo0>4z&9``bQlTVtozlcZGP*|;-*fdibHs`%Gr-ej%vXMg`15ZD
z?;#(yENlu(bu4)Ha1_h1;F$(?+jkXkEr*om(NT{Ml=U3vc=f6FlZJdO$jXUL(YX4;
zAe;~VJ-nA@Ud&*i8!WX<xo-nb@2kWPTUT{lecO
zK=NRKe_h5U%soRlY&o86DOh|av5J0VRQ@^tvq+VvPaT8^-|<(w8D=x!?wn@P;`$-5
z-)%s4!uZpJm>r~ET~Svq^0%Z>hgjUNVH-}45dI?hMc56zo#se@Ewbf?IaZUg)av?%
z<^Wi8f3s>{N7!`$m$X%l5ncUy^B0uHgBdjNgo;z4Q!<d2wliQ+SdTus5kpU{(lLI{Mq4E*;4y;j>|J-Akpl%Z(6oDg14ziW7biLyM!vj6Pd7uX^rZ?MA6|S9#38i$w;5Wq@0B82fo*
za6CRViN+(C=N>f0%D4|Y8^t5#V9Pn|7l3;w$=+hS<3s0*@Odn?f;47TvC|jGxHWB?G+SdRC0wVi3S3!0$JwGk8-~^m?Z?N`YB>P3_JE`rU<*TZ2!bN
zBBtUnt-7Zff|8neHZatjdq+{nmXs)ZB${M7xP9WqJCRRuE&^2RPe-cc{G^aN3Bvb-
z>zG3r!F!U*$~y=lqi4-U3STqS^qWFuu-_$dfCm+QVxmuZS<_gd@an`souc?jE0d|Y
zVw0iDC!aS5#B#A1N{L6$!_)JX@Qry8s?ZFUvOJe+PWX>tz7J{l`kD)s@u@w=9(hoR
z)77?21(y|9QjR=@sH$LwTP-IFrc>N2lEj4n@bx=D-6fh4x>udVj?0r&%@_WD?-50$
zLFD|xH=+l1z^P!6FcOHI$A37#Bee4KFX(<~z2R3aXLL6}C!DbE?d+SW$zAbGkb}AX
zf<*}xP#W13)A28BsF(NR2ctr39N;^pKZQ0}#NXmJYUOni;;j^&e?!Br)d!riV89jG
zcgkeuRhZ7pl|zi_(3QtiA^zGt#%cN!3D#3r_EVJ*yyc^z2-vc_bvx?Qe5%d~j3V;-
z+X8S3t^|Z73=NN`ejCe%q%I?6v9Fj@z8wl(eRs>6_8<=_Un6)1TvZXJla$rxmo$b9
zOto#akTiVt7qmv8HB)hIZP(^6@(ef!Dha$HAE`{l5e!N$>^}I|T~^m3{FdV;k`of>
zypz+pioR+(QzzQKKY#b~ZKI;(`?*aiyVCGkfUS$>I~&S-tygpHUkXEpB596#fL#l}
zbZgV(%;a=?tOXOn
zn?r7*oD0}o-Ny%_(3g-UDcfB&Sjp|9XeB#uXfd@<*X@7uIs=QM5I~^b={itlA2tO_mTKnh`kPyH{Yh
z3v?LJ^D#Tx0do7?l0?=TaG3eoQ*SwuA`G@31%#o!bt3pk{jmhHI|6*r
ze0t#z>jMa;KvThU8=&x`pnqjpytMriFnF8^1eM;11mH5<6U*2H9a;k2h3yrDdgj?8
zC+UDt05q6ls@W|C;8+5Orq)l`?iXiRGtjI7HQh$z1yu^0^Yh*maTA+YWVfq{*6qGw
ztAdf$hM4WcG-njBP_?&u=$0{2$Qm^D(hMMT$m?hU=5LC8?UY&j1{O_w4r5
zvaR)o$)8k8_;lQ=JI&&vdDC1(cnP*wbk1R?sGW5yi8gmP{>Rb)y7Y5MP`kZc_HTuee?io$Xdoei25ibslnkzTD>DGRpvjx&0oAa6gZ=hsbNUAdVAK4A
zHGi8nFoy^71TcSXXcVTu?S-Pg__-waO+7VdgA5<$PI!v~A;z~5(ir%ez2OO-XUlo{
zaS7}0lz;3}HdGvantsD&x7#lXZ0B<=egelD;5H@WHy&pjhhz1pZZ#@7{|jPg&-n=Gmd2`)7RQnk4GiGqt`D<-^bx6N$3XmH&6%2{^yr)a
zMI182r}bC=r2Oj}{|taWq_)V<@UyX=ua%P$C5i}3Ug1n2Ow!__97quG&%jbY)&u9j
zKtH`{_OtkE%+Wdkn!Qu^v-4i80-XaQErApWw+RgNjZ)#mu$vfbb?lk7b#Oeup$6K<
z^y}vU*02xz+|s+>PsiVk5kX7F`fDz4euJmRfXkr48~&LRizruRla%@2XQ#vS*<%3=w4Xonuh##4+<#v~
zvmy7m`UiIZ^Afmogy
z_)ECe@m=;7RsH9R4yV=K6A%Cj!8X|RZmy;3)?7ggpHkz6FBXO8yn5Ni!DLn8UlM#F
z`>6n^=@TcGW-0jW_BF_)L!}(=XV{jPZ~y0QJWGwP={iRL-#$=d0D=%$O6m%*ucC+I
zU6ISoC!|+18r<+qk@@?`lr^jeGw1$f(}XGhrSzjIPNOORd#NqtkzK*`)Z{-3n;>uM
zbWh#_y7C|SZHQH>AL5Du)1msO&7cJ_KY;E0GhG898Z?fqih}O<0NbT)Zqx*&Ge2BG
zdL!f}_!Hkw2g4iHAWy0WNN=Y785ThQ^F}k%nC^?eH(}MjmD1|pMaK&z1o)*Y1ptKo
zXQ=s`|%$v^-so=h$W{>1gh
zek4L$}8#ghqG2@u2l4Ty{!Ug>wmCK{i%ieV&(7cPsnMUYj_AO_8P+SRfu@%~g
zcqGz0o;BF{zju#+*<@GJH5eGZ*6TMmMg~Zkyo|$p5_u51r`OuQ0snP3z{f0H_ye9k
zlzQ_kW)$!h07U#WWb-H7i~)qHS-tIo1d3b#$#4Ns@k!33_)FD(@SoX#c>>wR5e0u0
zWK|w+P0jlGo?e^cODyo10aMBa=xFqGGl1&=S_Nz=%S*cl*3JX+aQrrLhSQ}+~{AtC1q&AftxaR&P3sReMdATuPTgR&4gEiTYyUpOI64YC8BA_jADHpwA@mRN&j
z89te}<3OlRJ+99(AC03vt%praahN@JPfL%^13BZ98U!}AcCYOJo@?PlD=ebbr%iPi
z4whW@#{F{#c?t?P8lUfpbq{X?ew-G1mj0L;PaQwaYd
zn7yJt29TzZOkQ^8h0DK1m#X4|rq-sgT1p0x`JN}uJ^vwmYz$p=n0sdR#F`t00aU8N
zU;P3|)nJPh7p6
z2ktI#v-AJllH9-j3!bl+ykAbfo-qoras)j%L(YoGrDvc<>{0huKz^)^n&T_Az40&S
zmb!m^2m4C|1d?hdl$f8k5-9Oc+G7Cjb&Q`t_E7coot~M>C+)JQjSuR@RU{DUfy6QYOXF?9KgSC~O}t^MObZk9
z2mB@z&H{XaFW_mX1mwa1h?(4G{EM1u#PwZ2{s$-uK>S>&_!RaxA%X---4koSj{%EF
zJ_&5;7~QY8XQ)9I9nSNJXIHz#0YV<&-Us@?592C}K%df_0>R)?+|>WKIV%MwPh5Ik
z#5~?ZBA6FXql|z}3vm0$+!|QN-M%W`GXOalut$u^K17uJv`c*hv5juFgCQ0X|fdSJPO1)_lGq%OG2}LGK+ug4g1t5Bb!J
z#ty_Z;3<*K^DP;}K6o^^f2nu$ZwNDInTj59@-=PNqyizOye1~4EHuUe{}7JFVO=th
zyy}Xb9~QGFVYrmWp_H^S$qJ7fMpUKU3{~|jCN2VW@E?3@l1*E{?I$Gs>Fsa)M8||T
zsUuhrTrwo~k+7F^X>j}6AK1hRCh}-y7*b?ONhrpUcn88(qUeB$n5=6yHGLQ9PZ`$8cvrdR{?Seb
z^>auF6wgEoifFWrdDbqKlrnH_{20}Zc8U;5+8=C4E})TYj-NBES$VX#@Ft?2CAH+A
z{V?B`DORuve|}pKiGKQeYfGzh>)lixPgl&P)~v{A9-?FG*B=y^eJEQOIBe3ga(SPx
z3s5y?Vrm2#qIQHSrshbX-u`N8C~6Ix%qby111X-nr#K=B^N;(96j;#{F?CH*Xb)s^$;u^BdI@kdq~Wl$
zwg!zE;t2C!V|qT;jE@edk@;c(&0p!m8;xJ{c?o^p=t^mpyqH5ZI-oW^O(}Gai%z3v
zN}1RibO8V%@{Jv-a7pg)kwT8RfIb4%%b!~QwQO&ZuMVI3A3Tqg3O`R*NU`~Qk@nim
zcy8$u%C*TfCb~
zz{!vX{y>AN&G*l-6(58PyPPiF%S~o{$-sh-D49@G%5#*~Qk0T2qftUfWvtw|BASo=
zXe2Z-rtgX3UMRbseD-xsi&1-CFlA3&%FpHXe%M+f=M{^yggjjhoOAt7Tw`Ncs58TR
zu{GO;vMot&ojS?scj4CN#J3aWFr%~)Zl~~jEv2>d9)lTzdwTuGNmBS|)i49&AJmJv
zvLmbT%{&d>pk49E>5>oQsj*a0B)aVFhWDDp5s?#erz)3snu5Xzk={7h+4vqb%o*P5
zir5#^QPoWkD>-E%@cmMxa%}06x4gKeG-xeKLxtRMTrHFG5OK0ciZf_%v(l|H+u_Wm
z8Xcxg*g)byhg46R)k69=$7H$`=y?$=4yZNHk%bqIGFS;8&U`~w@g&)aF7w(?iQA@U
z&Me^XpyM8qpA;$W+<1N^K1sfFQ>0Ywn#)=p*G|=}&Lkff?v{&uTbA0rLOk6}T~roR
z-dnN6uc7urw5^{v_)W|~E`^@xy>~3yY$$Syg~?@#Cj$;RuP#l9+7LPBn#o^~OHt%d
zdOzGU#zJ+aw?yu%+#QG?Z%Z0PF83MF;N;>;zho*(Xex#`HUMfKmM
z5BhcNj&<_*sehIm$l^9CVt}Qf8H69ma}G?m;M%vLr9HKlJ-C31nN68o-dQ
zl22A>*QM#79#7T!H;S;-IzA{5}d-@7@$xhIC@P
zN|Kd#2RH{2PmLtebS&w={dg&4Mbh5O9(J*K5{oE-DhFCO?7*lhM83}JEN{pkuH)<9
zNvSG29oE!EZ1-~plYHfqH+4x-+4hu*;NhmYDq!i`Niy)Z%;3&p@=yIE3LLu}a7gV=
z0cFX)LxQhg*lm^EUp598%s(kpv@>Mngd$eSeefjg?I^73XmkQmT&9gF%Ve5DMrWe^
zLl2vY*CISNaK9h>Ft2}~u^p_VeZ#Gzo>eVYxvr!AlDUFt-;@zX`;fYB3k;Bk$#)xC
zecv3vfmru^u)tsZRoB79pwY^`%KC9nVH7nk-e10QEtfZqKsnGn#&mR@I>5#DkvOV1
zgK4HjTr6){<>n^NjF@Rd;k<27p+k&7*h(Bp$Nmw=b5ac!MctW$>_Jv?5{4VQo(;^x
z+h(<&?p3@k@Hq!QzY{zYRm3U~nxZ&^(O=0Zxx*Yqk(Y@^x49mj?V!&)pAMZG@yet>3C%+!bY
zVu14ZQi5vNTRc=}N1_4>-+VaTksp#B5uITNh!zLhJ^{
z@#;{JCnKq%xjk>LuSDT*f$UC;fH|$HIt6}V*)qHc+w})b)W(+PnD;>p
z2PaSj+{>QN61(k2)pmtO)}}NQwRT2|5!+3Zr4}x1C1!^{`5!S@qtZJ-_N;>JLPeKz
zoEcsPMWj~(d#kvu)TZz^=Mrs!S54ouz#7}JUQs6-L5!~$A|f4&`Pz4W!3MiBaK4zNeGeMxn+pX(JH(@E|)rdgYGSruSdH{YbEuk$LGK3na=8a9`X
z>S;X51OEii;@7;KSm8qw4~cj*{8>$;5-}o&NaG9^(Fap~o=maE&Jfj;-K0jhZAG3{
z3oQS3DPEHx6cPaC(8TU%u$R23*t4Y~ls8VG_TRtL3Twb0E2@Z7!<_HsX5Ry$`w&jR
zW!4VO$ZT6VCVZq&jxLQl6Cd4otOZX+BJ|C7iG~lTF;BSQ5HK)mS2V96l(}_|E~Cr4
ztK~ADlSNYyG2sI@3Nh;nH0JBi=&Iek&%xgxF$9xyY{<$3ePr@I1Ft@=7Rr2>@QUsw
zVOPj*$L}q197^ZKRXTIve!-)nN>Ft_6BL_mpZfS4C|zWc4TtZN?g~`q7W@IoyW8Qb
ze-N|Wd5QcqRzvOoLrB_5kNSaW_2y7IcFJ)-Z6ZUY{QcQ%2Q|58aHo)|zFviLB^@N%Z$aIoXh=3`BuVApRC+F;+BOWx3|_usN%-wo`o@lg#b~w{MDT>E(<4
z(Fz)~CJNNl{c+xZsC@NI!)aAlp5zCA<-xCg`Nx;*vJK%r$(?sky2uk8aPX&_%tz(ryvi
zZ0XPF>_>4@@IoFb^Z=kyf}4ppv9&shwMx5FJ`N=uvpp-`;rrT75RKd794;+_7O*d)
ziisnfM}Jm$E8p}Ln+0?J`oWsuHGCP3|Ap8X1{!!@ZTOi@M_k$j1tMr+HC_BG>Zuay
zTh@F3wa`D9(3{UQTq&!sGxaA+edIr*XJAuVx&3}O*zlrNye1yH9G;eere%sG&^)Gc
zbCJUkQ>mxPt>fQ;>>VHrwa-;S*v&5NL)g01YFztREQztuviCcBG$})twU0t;MTlDH
zKZIX*Q?!Y*Qc9?G48Ryh8IByfpC~eYQl(1a7=3j95%zMMGkzX85Vk~XdPkZ_m;luZ
zSf7gv)yb%pQquG%H(1i2Vjew!3zWqRA5$Gz&A=55vj9?sm)vR9Gx5L
zffCLt|9G^sJUdxeU0F-xsZNQ`)-)L8UbH+!pp;HRzI%ar-a&^s1N{}2DFewW&Be_-
zg5k~SUT&z#^PkNGF
z!<~okWtr$KVi}xmMx1qH&xd*wD^-HmK*z#1DB0>O|2w4wPoYSsa2$C;R{tHWdJ-b;
zDEf@)Q&HxQ{}3>^a;&^cJc|c*Rl$j)_Y6Xj$0YQ=U0Z%?5`U&u->fqQI=FC*!HPTC
zRd>xtQ8wNy-g(%EA#AQ>*GOu04S9<6&@*`nOdIS~EO|!Vqhb}F(A&n>8zuR(tfw(u
zV+TY!^9_F?*nk8;P~eOk5^p*epb-u)4^`8TcQA4jP0rH`(1uA#DZ%J>j6po1&OR&g
z*Tf;MXfVOa^^;$l5Uj)5#451dP)o~7+NWEn_Xxe~hvS$Fg2|ZB3$tKT#7XgwB{nbr
zocvrc$xkg9gm4UEq=$C*<-LB!t9BjC}14;fOYqUg{%JIUz}~*D4Wf5HV9)xV-qiLhvDD-n^^uFm|YmIg*8{@RAM^
zBF~hO2PHW)joO4D?yr#7PBzP|e=(#qSDe-fSCjG($7d4iazPZ4*Bbk(1Eskst6yL3
z1h^fWZyTpy`RIW2jP;?6LpRk%s`Poyvf6_U=xAa=gf6ljRFq%4wl|WxDB1Tp`PNpy
zp7N8_Ho#RmGVQ1AKXD`sg1q3@bvou;Sie}_d1}RVl;Lhr`_)imSsMy{hYJ+<7cbcC
zY|A999-TydS|=e|n(vpaA$sXWYm8Havb7P=oEFm~^vpk3MNvZ40XX%F|Ji-*O22#^Mxi-Y}@ctDsJTCJ}dxIE)iN$slo-6-PidU&cMebF*d5>Dyyi9
zJ(13fxY6E(zNK&hQKaou2!_k5cAq(E$(3RBaNAK#ou`E+AK9te2)`oPKUETSku#EF
z$zyOO3LK6`9ahQl*SHWa;?{oWUYJ~?e;Mt04ASW9-}#B1nUX6vI%LaaosiScIUA*v
zOh}Xu9j!GaH!2|dkvlv=O18O8F&)0Od7U4K5Ca0r2RrtEQhM~$CAIuqbRUf^u8N(4
zmU|3k(za#D<|cc+EvutbT;n!LtgkIbG`
zX(C=h^ek66^G=wAzm__{1&DrCv*~Yn`VZJA#9v~8AL-~H{btPoZ5NW&fD`y=_5fW=
zF(9;ZUN{v)fWha%W4E&VMqc0?#Sq`an%SM2YfyWgih!Pad0)h4ya;ElpQBwErd^
zpE>GVq!^=+7OaJ;^;Ue^Bg;0F$uzuPB}v;iB|Va=(gKtP`c35;kXg!&&V6y>)`2qH
z7^BqHr}(b0M+Qkq%-$Ms=%qF8YxTSowD?3jiJkCfGb7Z_=AodkI6uTpD%*P?y*vGZvj4{Liqg}3nO&HjE92%DE
znQ1dLY2{MQJ&4pXBBmE%cDRC3X(!N1xv#l@u|NB4Z)JI)YDt+cT0f`UOJrIuOLtAu4w;Grbr>@Y30y}vBwu_(=!sX{vQG*jJcEZW5JuerGu2E
zn?$=$zemw|lSjtCI<_G0Yr^<+rml~Xy4^*C0tD;V@2(NQ&>1PcJek;d-NW!2kx?nV
zyhH2Q#G~8Jbny)^i>7?f^i&nfD{!v^*Pkp7C(#LqrmDiz4caOdv$#Oz3FMqt~KaSP
z$mRm{;y{$Mw-DOp1ahz>dd=7!#^L9Gi9hJyzbB?^LChpH;-aWkmv5haH4^8L0~dk4
z$%XYUDppO^LhwwDdoA0-MncJLO>!)()r1s=FNM_6h$;agoPA#@YRoHztb3x29HJH2
zhfm)pj~Ua|Gn{7ay^)TM(Sm)MJ>|@hyUy-61XJC-tjt{)m&0%PIJDkQA}~hO!%HIk
zzGzR1Yn-RdT%2|awPH=G{qSL`%GFS$NhUQk9QFsA>^}zhqd&%ERp@mdD^nA+*vjuCt1$yq-vfaaQ^mV(#>^DSzpq
z6-+;LQrRy#T%H;IHDHG#<-)f7g%8=+oi8p5XTu%M>1H2GhX-nZ;B1orV8IvGbS|Dd
zj_Z-lhAUT&*G6F;aDHS6=&EyBRLGtp4KL+G)q)FOdZA6!C~JyDy&va)g$_3Zx`^;k
z^(yKo6K+l(S5Cx`FTN$r*u=59-7hMdKr>v7%fFTLXNH^7rM7!#guO55@*{mM3OqJc>6P6-w8|ch#IAX?YjS_qaN>tNZ&s!pN&cK~8yTIjO7$3^rp47I}n5L}|PwxiaK_~kFgZY2x!
z(hlkFA6GzU{KicEdM1+3+i5uK+A206RJ3uTT!@_6oWc|D@A6$!9R7RPLtxkYHnN#u
z(}B#uGqt->bx5!Rd}b(6o3{5&**;q%#|jOj=F8+T7_NT~kjX}=Z1qgp$F2tNu{Ccj
zyu|OnZ~L*Bn`{MlE|(-xY0D*p#;u9
zmI(EI(LDRUjzBigRDVRv_5H}9EfAhCw~qJb1c-Z1DVIF?HtJ#u^YYppkiSj5ED5t|K)z!qAy2w`{(xo^+%CyG?#hX)eFh0D*>0Y=)&knoy^ytJIgo#R
z