dsh-neartoken 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +99 -73
- package/lib/client.js +78 -60
- package/lib/client.js.map +1 -1
- package/lib/index.js +2726 -186
- package/lib/types/client/groups.d.ts +1 -0
- package/lib/types/host/adapter.d.ts +21 -2
- package/lib/types/host/anthropic-wire.d.ts +24 -0
- package/lib/types/host/genai-wire.d.ts +16 -0
- package/lib/types/host/model-caps.d.ts +55 -6
- package/lib/types/host/model-caps.generated.d.ts +7 -4
- package/lib/types/host/pricing.d.ts +19 -4
- package/lib/types/host/protocol-router.d.ts +35 -0
- package/lib/types/host/provider-mount.d.ts +5 -0
- package/lib/types/host/responses-wire.d.ts +15 -0
- package/lib/types/host/sse.d.ts +51 -0
- package/lib/types/index.d.ts +49 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,64 +7,72 @@
|
|
|
7
7
|
|
|
8
8
|
## 架构
|
|
9
9
|
|
|
10
|
+
```mermaid
|
|
11
|
+
flowchart LR
|
|
12
|
+
subgraph site["New API 站点"]
|
|
13
|
+
pricing["/api/pricing<br/>模型 · 分组 · 倍率 · 容量 · 端点类型"]
|
|
14
|
+
device["/api/dsh/device/*<br/>设备授权"]
|
|
15
|
+
relay["/v1/messages · /v1beta · /v1/responses · /v1/chat/completions"]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
subgraph client["Client 半边 src/client"]
|
|
19
|
+
settings["设置页 NearTokenSection<br/>连接 / 账号卡片 / 模型白名单"]
|
|
20
|
+
picker["模型选择器 ModelGroupSelect<br/>模型 → 分组 → 推理等级"]
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
subgraph host["Host 半边 src/host"]
|
|
24
|
+
routes["routes.ts<br/>GET/POST /neartoken/*"]
|
|
25
|
+
account["NearTokenAccount<br/>轮询设备授权"]
|
|
26
|
+
creds[("credentials<br/>NEARTOKEN_API_KEY")]
|
|
27
|
+
provider["NearTokenProvider<br/>注册 / 撤下路由"]
|
|
28
|
+
adapter["NearTokenAdapter<br/>listModels · resolveModel · stream"]
|
|
29
|
+
catalog["PricingDirectory<br/>TTL 缓存 + 可见性过滤"]
|
|
30
|
+
wire["wire 层<br/>openai · anthropic · genai · responses"]
|
|
31
|
+
caps["model-caps.ts<br/>可见性 · 容量 · 推理等级"]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
settings --> routes
|
|
35
|
+
routes --> account
|
|
36
|
+
routes --> provider
|
|
37
|
+
account -->|"POST /api/dsh/device/token"| device
|
|
38
|
+
account -->|"授权成功写入"| creds
|
|
39
|
+
creds -->|"有 key 才挂路由"| provider
|
|
40
|
+
provider --> adapter
|
|
41
|
+
catalog -->|"GET /api/pricing"| pricing
|
|
42
|
+
catalog --> adapter
|
|
43
|
+
caps --> catalog
|
|
44
|
+
caps --> adapter
|
|
45
|
+
adapter --> wire
|
|
46
|
+
wire --> relay
|
|
47
|
+
adapter -.->|"经 ctx.llm 发布目录"| picker
|
|
10
48
|
```
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
│ · 存插件自身 Config 的 enabledModels(volatile),经 settings.update │
|
|
24
|
-
│ 写入 profile patch;volatile 使改动热提交、不重挂插件 │
|
|
25
|
-
│ · 空数组 = 没设白名单 = 全部显示 │
|
|
26
|
-
│ NearTokenProvider(provider-mount.ts) │
|
|
27
|
-
│ · 有 key → registerAdapter + registerConfigurableProviders │
|
|
28
|
-
│ · 没 key → 撤掉路由(列表里不会出现调不通的模型) │
|
|
29
|
-
│ NearTokenAdapter(adapter.ts) │
|
|
30
|
-
│ · listModels: GET /api/pricing → (group, model) 笛卡尔展开 │
|
|
31
|
-
│ catalog id = "<group>::<model>",name = "<model> @ <group>" │
|
|
32
|
-
│ 再按「模型过滤」与白名单(裸模型名)过滤;stream 用同批路由找分组│
|
|
33
|
-
│ · stream: POST /v1/chat/completions(OpenAI 协议) │
|
|
34
|
-
│ body.model = 裸模型名 │
|
|
35
|
-
│ header x-neartoken-group = 分组的 ref "#<id>"(不是分组名) │
|
|
36
|
-
└────────────────────────────────────────────────────────────────────┘
|
|
37
|
-
┌─ client 半边(src/client/)────────────────────────────────────────┐
|
|
38
|
-
│ settings.section(order -5,账号与余额 ↔ 通用设置之间) │
|
|
39
|
-
│ NearTokenSection:连接按钮 / 确认码 + 打开浏览器 / 账号卡片 / 断开 │
|
|
40
|
-
│ + 模型白名单(搜索、全选、清空、全部显示、保存) │
|
|
41
|
-
│ · 行内:模型名 + 分组数 + 最低倍率胶囊;分组明细 hover 出浮层 │
|
|
42
|
-
│ · 分组名按站点规则渲染成彩色 tag 胶囊(低价=绿、反重力=青…) │
|
|
43
|
-
│ · 只列出可提供的模型(见下「模型过滤」) │
|
|
44
|
-
│ conversation.input.model(priority -1 覆盖内置模型座) │
|
|
45
|
-
│ · name 按 " @ " 拆回 (模型, 分组),同模型折叠成一行 │
|
|
46
|
-
│ · 触发器显示 "Claude Opus 5 C @ NearToken",不渲染分组 │
|
|
47
|
-
│ · 列表项按 displayModelName 美化(- → 空格,逐词首字母大写) │
|
|
48
|
-
│ · 分组只在「分组」那一级里出现("[低价][反重力] Claude" → tag 胶囊)│
|
|
49
|
-
│ · 倍率从 catalog description("分组倍率 0.4x")解析显示 │
|
|
50
|
-
│ · 数据仍走 ctx.modelDirectories(与 /model 弹窗同一份状态) │
|
|
51
|
-
└────────────────────────────────────────────────────────────────────┘
|
|
52
|
-
```
|
|
49
|
+
|
|
50
|
+
| 文件 | 职责 |
|
|
51
|
+
|---|---|
|
|
52
|
+
| `src/index.ts` | 配置 schema、按凭据现状挂载 provider、装配其余模块 |
|
|
53
|
+
| `src/host/account.ts` | RFC 8628 形状的设备授权:发起、按 interval 轮询、把 key 写进 credentials |
|
|
54
|
+
| `src/host/routes.ts` | 设置页调用的同源路由(状态 / 授权 / 取消 / 断开 / 模型白名单) |
|
|
55
|
+
| `src/host/whitelist.ts` | 白名单读写在插件自身 Config 的 `enabledModels`(volatile),存 profile patch |
|
|
56
|
+
| `src/host/pricing.ts` | 拉 `/api/pricing`,展开成 `"<组>::<模型>"` 路由,过滤出能聊的模型 |
|
|
57
|
+
| `src/host/model-caps.ts` | 一个模型能不能聊、上下文窗口多大、可选的推理等级 |
|
|
58
|
+
| `src/host/adapter.ts` | 目录、元数据、按模型选协议并流式解析 |
|
|
59
|
+
| `src/host/*-wire.ts` | 四条上游协议各自的请求体与 SSE 解析 |
|
|
60
|
+
| `src/client/` | 设置页、模型选择器、分组胶囊渲染 |
|
|
53
61
|
|
|
54
62
|
## 使用
|
|
55
63
|
|
|
56
64
|
1. 装插件、重启 `dsh web`、硬刷新。
|
|
57
65
|
2. 打开 **设置 → NearToken**,点「连接 NearToken」。
|
|
58
|
-
3.
|
|
59
|
-
4. 插件轮询到批准后自动完成:把站点为该插件铸造的 API key 写进 credentials 的 `NEARTOKEN_API_KEY`,并挂上 `neartoken` provider
|
|
66
|
+
3. 设置页显示确认码;点「打开浏览器确认」,在站点自己的页面登录(密码、2FA、passkey 都走站点原生流程)并批准。
|
|
67
|
+
4. 插件轮询到批准后自动完成:把站点为该插件铸造的 API key 写进 credentials 的 `NEARTOKEN_API_KEY`,并挂上 `neartoken` provider。
|
|
60
68
|
5. 「断开连接」删掉本地凭据、撤掉 provider,并调用站点的撤销端点。
|
|
61
|
-
6.
|
|
69
|
+
6. 卡片下方的「模型白名单」勾选即自动保存 —— 未勾选的不再出现在模型选择器里,且当场生效(Host 用 `AdapterRegistrationHandle.replace()` 重新声明同一条路由,同步发布 `llm/adapters-updated`,浏览器重拉目录)。没设置过白名单时默认全部显示,「全部显示」清空白名单。
|
|
62
70
|
|
|
63
|
-
备用路径:直接让 credentials 服务存 `NEARTOKEN_API_KEY
|
|
71
|
+
备用路径:直接让 credentials 服务存 `NEARTOKEN_API_KEY`,或启动环境导出同名变量 —— provider 会在启动时按凭据现状挂载。
|
|
64
72
|
|
|
65
|
-
>
|
|
73
|
+
> 设备授权流需要 new-api 侧实现对应端点,契约见 [HANDOFF-new-api.md](HANDOFF-new-api.md) 第一部分。站点尚未实现时会直接报「站点拒绝发起设备授权」。
|
|
66
74
|
|
|
67
|
-
|
|
75
|
+
分组路由按同一文档:请求头 `x-neartoken-group` 的值是 `/api/pricing` 的 `group_refs` 给出的 **`#<id>`**(纯 ASCII),分组名只用于展示;某分组没有 ref 时不发该头,按令牌自身分组路由。
|
|
68
76
|
|
|
69
77
|
## 配置
|
|
70
78
|
|
|
@@ -73,44 +81,61 @@
|
|
|
73
81
|
| `baseURL` | `https://llm.pko.svcfusion.com` | 站点根地址,不带尾斜杠 |
|
|
74
82
|
| `apiKeyEnv` | `NEARTOKEN_API_KEY` | 授权写入、adapter 读取的凭据引用名 |
|
|
75
83
|
| `catalogTtlMs` | `300000` | `/api/pricing` 目录缓存时长 |
|
|
84
|
+
| `defaultContextWindow` | `200000` | 没有任何来源能说明某模型上下文窗口时上报的值 |
|
|
85
|
+
| `modelOverrides` | `{}` | 按裸模型名逐条修正容量与推理等级,见下 |
|
|
76
86
|
| `enabledModels` | `[]` | 模型白名单(裸模型名);空数组 = 全部显示。唯一 volatile 字段,设置页直接写它 |
|
|
77
87
|
|
|
78
|
-
|
|
88
|
+
`modelOverrides` 是「站点没声明、目录还没收录」时的兜底手段,改完重启即生效,**不需要发新版本**:
|
|
79
89
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
90
|
+
```yaml
|
|
91
|
+
- id: dsh-neartoken
|
|
92
|
+
config:
|
|
93
|
+
defaultContextWindow: 200000
|
|
94
|
+
modelOverrides:
|
|
95
|
+
gemini-4-argon:
|
|
96
|
+
contextWindow: 1048576
|
|
97
|
+
reasoning: [low, medium, high, max]
|
|
98
|
+
```
|
|
86
99
|
|
|
87
|
-
|
|
100
|
+
## 模型可见性
|
|
88
101
|
|
|
89
|
-
|
|
102
|
+
站点 `/api/pricing` 会列出它知道的所有模型,插件只提供会响应聊天请求的那部分:
|
|
90
103
|
|
|
91
|
-
|
|
104
|
+
1. **站点自己声明的 `supported_endpoint_types` 优先**:含 `openai` / `openai-response` / `anthropic` / `gemini` 任一即可见。这是站点上新增模型当天就能出现在选择器里的原因 —— 不需要等插件发版。
|
|
105
|
+
2. 无论站点声明什么,`-c` 后缀与媒体名(image / tts / transcribe / asr)都不提供 —— 定价接口把这些路由也挂在 `openai` 这个 surface 下,只看声明会把生图和语音模型塞进聊天选择器。
|
|
106
|
+
3. **站点没声明时**回退到名字规则:pi-ai 目录里没有的名字不提供。
|
|
92
107
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
|
108
|
+
## 容量与推理等级
|
|
109
|
+
|
|
110
|
+
上下文窗口(`contextWindow`)决定两件事:对话里的占用率显示,以及自动压缩的阈值。**它缺失时自动压缩会直接放弃**(compaction 后端拒绝为无界模型计算摘要预算),所以插件永远会给出一个值。优先级:
|
|
111
|
+
|
|
112
|
+
| 优先级 | 来源 | 维护方式 |
|
|
113
|
+
|---|---|---|
|
|
114
|
+
| 1 | `modelOverrides` | 改 profile 配置,重启 |
|
|
115
|
+
| 2 | 站点 `/api/pricing` 的 `context_window` | 在 New API 管理后台维护,见下 |
|
|
116
|
+
| 3 | pi-ai 生成表(`src/host/model-caps.generated.ts`) | `pnpm run gen:model-caps` |
|
|
117
|
+
| 4 | `defaultContextWindow` | 改 profile 配置 |
|
|
98
118
|
|
|
99
|
-
|
|
119
|
+
**推荐在站点侧维护**:New API 管理后台可以给每个模型填上下文窗口与最大输出,`/api/pricing` 会把它们作为 `context_window` / `max_tokens` 发出来。这样一台站点的容量对**所有客户端一致生效**,插件不需要跟着站点上新模型发版。维护步骤见 new-api 仓库 `AGENTS.md` 的「模型容量清单」一节。
|
|
100
120
|
|
|
101
|
-
|
|
121
|
+
最大输出(`max_tokens`)只在**站点或配置明确给出**时才写进请求;生成表里的 `maxTokens` 是厂商口径,站点可能把同一个名字路由到上限更低的渠道,照发会把「回答被截断」换成「请求被拒」,所以不用它。不给出该字段时由上游默认值决定。
|
|
102
122
|
|
|
103
|
-
|
|
123
|
+
推理等级来自 `@earendil-works/pi-ai` 的模型目录(DSH 的 `llm-pi-ai` 用的同一份数据)。插件不在运行时依赖它:`scripts/gen-model-caps.mjs` 把目录生成成 `src/host/model-caps.generated.ts`(1101 个 chat 模型、486 个带推理档位、1101 个带上下文窗口),升级依赖后跑 `pnpm run gen:model-caps` 重建。同一模型 id 在不同 provider 下可能给出不同档位(网关常只列两档,厂商列六档),生成时取**最完整**的那份;上下文窗口取**最小**的那份。
|
|
104
124
|
|
|
105
|
-
##
|
|
125
|
+
## 已知限制
|
|
106
126
|
|
|
107
|
-
- wire
|
|
127
|
+
- 四套 wire(chat / anthropic / genai / responses)各自解析 SSE;图片与文件仍以占位文本发送;`/model` 弹窗仍是内置平铺列表;箭头键盘导航未接。
|
|
128
|
+
- 四套 wire 的 SSE 解析都有「帧样本 → 期望 chunk 序列」回归测试(`src/host/wire-parse.spec.ts`),帧样本取自生产网关的真实响应。网关在内容帧上发 `"usage": null`,只有末帧带真值:任何一处把 `usage` 当对象直接读都会让整条流中途崩掉(曾导致 claude 模型全不可用)。
|
|
129
|
+
- 推理等级按各协议自己的词汇发送:**anthropic 发 `thinking.type=adaptive` + `output_config.effort`**(不能再用 `thinking.type=enabled` + `budget_tokens`:Claude 5 代直接 400 `requires adaptive thinking`,而 adaptive 在老代际上同样可用,所以统一用它;`minimal` 收敛成 `low`);genai 发 `thinkingConfig` 且带 `includeThoughts`(不带你拿不到思维链);chat 与 responses 发 `reasoning_effort` / `reasoning.effort`。
|
|
130
|
+
- **Gemini 4 换成 `thinkingLevel`**:这一代不再接受 token 预算(发 budget 会 400 `Use thinking level instead`),按 `gemini-<主版本>` ≥ 4 自动切换字段,等级名用 `low` / `medium` / `high` / `max`。
|
|
131
|
+
- 思考历史**不回传**:harness 的 reasoning 块没有 signature 槽位,anthropic 的 `signature_delta` 与 gemini 的 `thoughtSignature` 都被丢弃。当前网关的转换层本身也会丢弃 thinking 块,所以多轮不会因此报错;接真正的 Anthropic / Gemini 直连渠道时这一条会变成硬限制。
|
|
132
|
+
- 文本与思维块由**第一个非空 delta** 打开,思维块为空时不产生空块;工具调用块在 `content_block_start` 打开,因为 id 与函数名只在那里出现。
|
|
133
|
+
- anthropic 线不硬编码 `max_tokens`:只在调用方给了上限、或开了 thinking 需要余量时才发。给死值会截断长回答。
|
|
134
|
+
- `-c` 后缀是站点自己的约定(带该后缀的模型工具调用不可靠):站点声明了端点类型时插件按声明提供,声明里没有它就不会出现;没有声明时按名字隐藏它的无后缀孪生之外的变体。
|
|
135
|
+
- 站点上新、pi-ai 目录还没收录的模型:只要站点声明了端点类型就会提供,容量走 `defaultContextWindow`,推理等级为空(除非在 `modelOverrides` 里写明)。
|
|
108
136
|
- pricing 加载失败时沿用上一次成功的结果,从未成功过则目录为空(失败不写缓存,下次调用会重试)。
|
|
109
137
|
- 账号卡片不自动刷新:数字只来自授权那一刻 grant 里的 `user`(站点的 dashboard 接口认浏览器会话,不认本插件持有的 relay key),落盘到 profile 下的 `neartoken-account.json`,重启后从文件恢复。之后余额变化不会反映,需要重新连接一次。
|
|
110
|
-
-
|
|
111
|
-
- 设备授权流依赖 new-api 侧实现,未实现前插件只能走「外部导出 key」的备用路径。
|
|
112
|
-
- 白名单按裸模型名过滤:勾掉某模型会把它的所有分组一起隐藏。某个正在使用的模型被勾掉后,会话里已选中的 id 仍在,但选择器里不再列出它。
|
|
113
|
-
- 「-c 后缀」是站点自己的约定:带该后缀的模型工具调用不可靠,插件只在界面上标注(设置页与模型选择器),不拦截选择。
|
|
138
|
+
- 白名单按裸模型名过滤:勾掉某模型会把它的所有分组一起隐藏;某个正在使用的模型被勾掉后,会话里已选中的 id 仍在,但选择器里不再列出它。
|
|
114
139
|
- 白名单写入走 DSH 的 Settings:profile 里该行只保留 volatile 字段,所以别把 `baseURL` 等非 volatile 字段写进**同一个 profile 行**(会在此后第一次保存白名单时被 Settings 的 strip 规则清掉)。
|
|
115
140
|
|
|
116
141
|
## 开发
|
|
@@ -118,6 +143,7 @@
|
|
|
118
143
|
```sh
|
|
119
144
|
pnpm install
|
|
120
145
|
pnpm run typecheck
|
|
121
|
-
pnpm run test # vitest:account
|
|
146
|
+
pnpm run test # vitest:account / pricing / adapter / model-caps / groups / whitelist / routes / config / wire-parse
|
|
147
|
+
pnpm run gen:model-caps # 升级 @earendil-works/pi-ai 后重建能力表
|
|
122
148
|
pnpm run build # lib/index.js (host) + lib/client.js (client) + lib/types
|
|
123
149
|
```
|
package/lib/client.js
CHANGED
|
@@ -196,8 +196,26 @@ window.__ModuleLoader__.load({
|
|
|
196
196
|
};
|
|
197
197
|
}
|
|
198
198
|
/**
|
|
199
|
+
* The capitals each vendor writes its own family name with.
|
|
200
|
+
*
|
|
201
|
+
* The catalog publishes ids in lowercase only, so the display name has to put
|
|
202
|
+
* them back: GPT and GLM are acronyms, DeepSeek is camel case, MiniMax and MiMo
|
|
203
|
+
* keep an inner capital, and the `xhigh` effort is spelled `XHigh` everywhere
|
|
204
|
+
* else in the product.
|
|
205
|
+
*/
|
|
206
|
+
const BRAND_SPELLING = {
|
|
207
|
+
gpt: "GPT",
|
|
208
|
+
glm: "GLM",
|
|
209
|
+
deepseek: "DeepSeek",
|
|
210
|
+
minimax: "MiniMax",
|
|
211
|
+
mimo: "MiMo",
|
|
212
|
+
xhigh: "XHigh",
|
|
213
|
+
tts: "TTS"
|
|
214
|
+
};
|
|
215
|
+
/**
|
|
199
216
|
* Render a model name the way the pickers show it: hyphens become separators
|
|
200
217
|
* and every word is capitalized, so `claude-opus-5-c` reads `Claude Opus 5 C`.
|
|
218
|
+
* A vendor's own spelling wins over that rule (`gpt-5.5` reads `GPT 5.5`).
|
|
201
219
|
*
|
|
202
220
|
* The trailing `-c` stays a word on purpose: the site pairs every such model
|
|
203
221
|
* with a twin that lacks the suffix (`claude-opus-5` beside `claude-opus-5-c`),
|
|
@@ -208,7 +226,7 @@ window.__ModuleLoader__.load({
|
|
|
208
226
|
* @returns the display name.
|
|
209
227
|
*/
|
|
210
228
|
function displayModelName(model) {
|
|
211
|
-
return model.split("-").filter((part) => part.length > 0).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
|
|
229
|
+
return model.split("-").filter((part) => part.length > 0).map((part) => BRAND_SPELLING[part.toLowerCase()] ?? part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
|
|
212
230
|
}
|
|
213
231
|
/**
|
|
214
232
|
* Read the group ratio out of the host-provided catalog description.
|
|
@@ -287,23 +305,23 @@ window.__ModuleLoader__.load({
|
|
|
287
305
|
document.head.appendChild(tag);
|
|
288
306
|
}
|
|
289
307
|
var group_tags_module_css_default = {
|
|
308
|
+
"toneFuchsia": "FotuUq_toneFuchsia",
|
|
290
309
|
"ratioCheap": "FotuUq_ratioCheap",
|
|
310
|
+
"toneSky": "FotuUq_toneSky",
|
|
311
|
+
"toneIndigo": "FotuUq_toneIndigo",
|
|
312
|
+
"toneViolet": "FotuUq_toneViolet",
|
|
313
|
+
"toneLime": "FotuUq_toneLime",
|
|
291
314
|
"ratioChip": "FotuUq_ratioChip",
|
|
315
|
+
"toneTeal": "FotuUq_toneTeal",
|
|
316
|
+
"tag": "FotuUq_tag",
|
|
292
317
|
"toneRose": "FotuUq_toneRose",
|
|
293
|
-
"toneLime": "FotuUq_toneLime",
|
|
294
|
-
"ratioPricey": "FotuUq_ratioPricey",
|
|
295
|
-
"toneCyan": "FotuUq_toneCyan",
|
|
296
318
|
"toneOrange": "FotuUq_toneOrange",
|
|
297
|
-
"toneSky": "FotuUq_toneSky",
|
|
298
|
-
"toneIndigo": "FotuUq_toneIndigo",
|
|
299
|
-
"toneEmerald": "FotuUq_toneEmerald",
|
|
300
319
|
"ratioBase": "FotuUq_ratioBase",
|
|
301
|
-
"
|
|
302
|
-
"
|
|
303
|
-
"tonePink": "FotuUq_tonePink",
|
|
320
|
+
"toneEmerald": "FotuUq_toneEmerald",
|
|
321
|
+
"ratioPricey": "FotuUq_ratioPricey",
|
|
304
322
|
"toneAmber": "FotuUq_toneAmber",
|
|
305
|
-
"
|
|
306
|
-
"
|
|
323
|
+
"toneCyan": "FotuUq_toneCyan",
|
|
324
|
+
"tonePink": "FotuUq_tonePink"
|
|
307
325
|
};
|
|
308
326
|
//#endregion
|
|
309
327
|
//#region src/client/group-tags.tsx
|
|
@@ -358,39 +376,39 @@ window.__ModuleLoader__.load({
|
|
|
358
376
|
document.head.appendChild(tag);
|
|
359
377
|
}
|
|
360
378
|
var ModelGroupSelect_module_css_default = {
|
|
361
|
-
"
|
|
362
|
-
"optionTrailing": "_2pt-bW_optionTrailing",
|
|
379
|
+
"error": "_2pt-bW_error",
|
|
363
380
|
"variantCount": "_2pt-bW_variantCount",
|
|
364
381
|
"searchRow": "_2pt-bW_searchRow",
|
|
365
|
-
"retry": "_2pt-bW_retry",
|
|
366
|
-
"cellLabel": "_2pt-bW_cellLabel",
|
|
367
|
-
"optionCopy": "_2pt-bW_optionCopy",
|
|
368
|
-
"searchClear": "_2pt-bW_searchClear",
|
|
369
|
-
"groupInline": "_2pt-bW_groupInline",
|
|
370
382
|
"status": "_2pt-bW_status",
|
|
371
|
-
"chevron": "_2pt-bW_chevron",
|
|
372
|
-
"cellChevron": "_2pt-bW_cellChevron",
|
|
373
|
-
"toast": "_2pt-bW_toast",
|
|
374
|
-
"option": "_2pt-bW_option",
|
|
375
383
|
"optionActive": "_2pt-bW_optionActive",
|
|
376
|
-
"menu": "_2pt-bW_menu",
|
|
377
|
-
"error": "_2pt-bW_error",
|
|
378
|
-
"triggerIcon": "_2pt-bW_triggerIcon",
|
|
379
|
-
"warning": "_2pt-bW_warning",
|
|
380
|
-
"cellValue": "_2pt-bW_cellValue",
|
|
381
384
|
"triggerLabel": "_2pt-bW_triggerLabel",
|
|
382
|
-
"
|
|
385
|
+
"menu": "_2pt-bW_menu",
|
|
386
|
+
"cellLabel": "_2pt-bW_cellLabel",
|
|
387
|
+
"groupInline": "_2pt-bW_groupInline",
|
|
383
388
|
"empty": "_2pt-bW_empty",
|
|
384
|
-
"
|
|
385
|
-
"
|
|
386
|
-
"search": "_2pt-bW_search",
|
|
389
|
+
"trigger": "_2pt-bW_trigger",
|
|
390
|
+
"searchClear": "_2pt-bW_searchClear",
|
|
387
391
|
"check": "_2pt-bW_check",
|
|
392
|
+
"modelName": "_2pt-bW_modelName",
|
|
393
|
+
"cellValue": "_2pt-bW_cellValue",
|
|
394
|
+
"warning": "_2pt-bW_warning",
|
|
395
|
+
"triggerIcon": "_2pt-bW_triggerIcon",
|
|
396
|
+
"option": "_2pt-bW_option",
|
|
397
|
+
"groups": "_2pt-bW_groups",
|
|
398
|
+
"cellChevron": "_2pt-bW_cellChevron",
|
|
399
|
+
"cell": "_2pt-bW_cell",
|
|
400
|
+
"optionCopy": "_2pt-bW_optionCopy",
|
|
401
|
+
"optionTrailing": "_2pt-bW_optionTrailing",
|
|
388
402
|
"triggerEffort": "_2pt-bW_triggerEffort",
|
|
389
|
-
"groupName": "_2pt-bW_groupName",
|
|
390
403
|
"groupOptionLabel": "_2pt-bW_groupOptionLabel",
|
|
404
|
+
"groupName": "_2pt-bW_groupName",
|
|
391
405
|
"root": "_2pt-bW_root",
|
|
392
|
-
"
|
|
393
|
-
"
|
|
406
|
+
"selected": "_2pt-bW_selected",
|
|
407
|
+
"modelOption": "_2pt-bW_modelOption",
|
|
408
|
+
"search": "_2pt-bW_search",
|
|
409
|
+
"chevron": "_2pt-bW_chevron",
|
|
410
|
+
"retry": "_2pt-bW_retry",
|
|
411
|
+
"toast": "_2pt-bW_toast"
|
|
394
412
|
};
|
|
395
413
|
//#endregion
|
|
396
414
|
//#region src/client/ModelGroupSelect.tsx
|
|
@@ -956,41 +974,41 @@ window.__ModuleLoader__.load({
|
|
|
956
974
|
document.head.appendChild(tag);
|
|
957
975
|
}
|
|
958
976
|
var NearTokenSection_module_css_default = {
|
|
977
|
+
"button": "_02HI2q_button",
|
|
959
978
|
"rowMeta": "_02HI2q_rowMeta",
|
|
960
|
-
"
|
|
961
|
-
"
|
|
979
|
+
"fact": "_02HI2q_fact",
|
|
980
|
+
"notice": "_02HI2q_notice",
|
|
962
981
|
"form": "_02HI2q_form",
|
|
963
|
-
"
|
|
964
|
-
"
|
|
965
|
-
"tipRow": "_02HI2q_tipRow",
|
|
966
|
-
"factLabel": "_02HI2q_factLabel",
|
|
967
|
-
"cardHead": "_02HI2q_cardHead",
|
|
968
|
-
"rowName": "_02HI2q_rowName",
|
|
969
|
-
"code": "_02HI2q_code",
|
|
982
|
+
"codeRow": "_02HI2q_codeRow",
|
|
983
|
+
"section": "_02HI2q_section",
|
|
970
984
|
"badgeOn": "_02HI2q_badgeOn",
|
|
985
|
+
"buttonPrimary": "_02HI2q_buttonPrimary",
|
|
986
|
+
"rowName": "_02HI2q_rowName",
|
|
987
|
+
"intro": "_02HI2q_intro",
|
|
971
988
|
"list": "_02HI2q_list",
|
|
972
|
-
"
|
|
973
|
-
"facts": "_02HI2q_facts",
|
|
974
|
-
"row": "_02HI2q_row",
|
|
989
|
+
"name": "_02HI2q_name",
|
|
975
990
|
"actions": "_02HI2q_actions",
|
|
991
|
+
"facts": "_02HI2q_facts",
|
|
992
|
+
"autosave": "_02HI2q_autosave",
|
|
993
|
+
"label": "_02HI2q_label",
|
|
994
|
+
"tipGroupName": "_02HI2q_tipGroupName",
|
|
976
995
|
"hint": "_02HI2q_hint",
|
|
977
|
-
"tipTitle": "_02HI2q_tipTitle",
|
|
978
|
-
"intro": "_02HI2q_intro",
|
|
979
|
-
"fact": "_02HI2q_fact",
|
|
980
996
|
"factValue": "_02HI2q_factValue",
|
|
981
|
-
"
|
|
982
|
-
"
|
|
983
|
-
"
|
|
984
|
-
"codeRow": "_02HI2q_codeRow",
|
|
985
|
-
"handle": "_02HI2q_handle",
|
|
997
|
+
"tipTitle": "_02HI2q_tipTitle",
|
|
998
|
+
"tipRow": "_02HI2q_tipRow",
|
|
999
|
+
"row": "_02HI2q_row",
|
|
986
1000
|
"badge": "_02HI2q_badge",
|
|
987
|
-
"
|
|
1001
|
+
"code": "_02HI2q_code",
|
|
1002
|
+
"tip": "_02HI2q_tip",
|
|
1003
|
+
"factLabel": "_02HI2q_factLabel",
|
|
988
1004
|
"search": "_02HI2q_search",
|
|
989
1005
|
"toolbar": "_02HI2q_toolbar",
|
|
990
|
-
"
|
|
991
|
-
"
|
|
992
|
-
"
|
|
993
|
-
"
|
|
1006
|
+
"title": "_02HI2q_title",
|
|
1007
|
+
"rowRatio": "_02HI2q_rowRatio",
|
|
1008
|
+
"card": "_02HI2q_card",
|
|
1009
|
+
"handle": "_02HI2q_handle",
|
|
1010
|
+
"cardHead": "_02HI2q_cardHead",
|
|
1011
|
+
"tipGroup": "_02HI2q_tipGroup"
|
|
994
1012
|
};
|
|
995
1013
|
//#endregion
|
|
996
1014
|
//#region src/client/NearTokenSection.tsx
|