dsh-ssh-tui 0.3.7 → 0.3.8

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.en.md CHANGED
@@ -72,10 +72,18 @@ because the manifest declares `dsh.bundle`.
72
72
  Optional: reuse a SuperGrok / grok-bridge token already on the machine:
73
73
 
74
74
  ```sh
75
- dsh plugin --profile tui add github:cyjyyd/dsh-llm-xai-oauth
76
- dsh plugin --profile headless add github:cyjyyd/dsh-llm-xai-oauth
75
+ dsh plugin --profile tui add dsh-llm-xai-oauth
76
+ dsh plugin --profile headless add dsh-llm-xai-oauth
77
77
  ```
78
78
 
79
+ SuperGrok access tokens last about an hour. The TUI refreshes a due token on open, and `/usage` force-refreshes once after HTTP 401. If dsh is not running overnight, install the companion refresher or the next session starts with 401:
80
+
81
+ ```sh
82
+ npx dsh-llm-xai-oauth daemon --install
83
+ ```
84
+
85
+ See [dsh-llm-xai-oauth](https://github.com/cyjyyd/dsh-llm-xai-oauth).
86
+
79
87
  Smoke the route before opening the TUI. The TUI exits immediately without a TTY:
80
88
 
81
89
  ```sh
@@ -249,11 +257,14 @@ configured catalog when the endpoint cannot be reached. Picking a model that
249
257
  is not stored in the provider profile automatically adds it to
250
258
  `llm-pi-ai.providers.<id>.models` so the harness can serve it.
251
259
 
252
- Subagents follow the parent session's provider by default and run on the
253
- lightweight `deepseek-v4-flash` model. `/submodel [model-id]` picks (or
254
- directly sets) the subagent model, and `/subeffort` picks the subagent
255
- reasoning effort or restores the provider default. Both commands are
256
- remembered under `ssh-tui-subagent` in `$DSH_HOME/settings.yaml`.
260
+ Subagents follow the parent session's provider by default. Switching
261
+ provider/model persists the subagent model automatically (closest name to
262
+ the parent's, `flash`-suffixed ids first — `deepseek-v4-flash`,
263
+ `grok-4.5`); no dialog is shown, and `/submodel` still overrides it.
264
+ `/submodel [model-id]` picks (or directly sets) the subagent model, and
265
+ `/subeffort` picks the subagent reasoning effort or restores the provider
266
+ default. Both commands are remembered under `ssh-tui-subagent` in
267
+ `$DSH_HOME/settings.yaml`.
257
268
  `/subagents` lists active subagents, and `/subagents kill <session-id> [more ids...]`
258
269
  releases selected continuable children using the harness 0.1.1
259
270
  `drainContinuableChildren` capability.
@@ -327,16 +338,17 @@ animated spinner plus `运行中 · 工具 N` while working, `✓ 已完成` for
327
338
  seconds after completion, and `待命` when idle. A terminal bell rings on
328
339
  completion (`DSH_TUI_NO_BELL=1` disables it).
329
340
 
330
- Tool calls render as compact cards instead of raw argument JSON. A colored
331
- dot leads each card — yellow while running, green on success, red on failure
332
- (a shell command with a non-zero exit or signal also turns red, with a
333
- `[退出码 N]` / `[信号 X]` suffix). Shell tools show the command as
334
- `$ command`, file mutations (`edit` / `write` / `str_replace_editor`) render
335
- the applied change git-style: a path header, `-` lines on a light-red
336
- background, `+` lines on a light-green background, and a `└ +N -M · K file(s)`
337
- footer. File-mutation diffs are shown in full (never collapsed to a `… more`
338
- line) and their cards start expanded. Other tools show a short argument
339
- summary and start collapsed to a single line (the command, truncated with
341
+ Tool calls render as compact cards instead of raw argument JSON. The card
342
+ header and result text follow the execution state — yellow while running,
343
+ green on success, red on failure (a shell command with a non-zero exit or
344
+ signal also turns red, with a `[退出码 N]` / `[信号 X]` suffix). Shell tools
345
+ show the command as dim-grey `$ command`, file mutations (`edit` / `write` /
346
+ `str_replace_editor`) render the applied change git-style: a path header,
347
+ `-` lines on a dark-red background, `+` lines on a dark-green background,
348
+ and a `└ +N -M · K file(s)` footer. File-mutation diffs are shown in full
349
+ (never collapsed to a `… more` line) and their cards start expanded. Other
350
+ tools show a short argument summary and start collapsed to a single line
351
+ (the command, truncated with
340
352
  `…` when long); expand to reveal output or the result body. Expanded generic
341
353
  calls convert their JSON arguments and JSON results into readable indented
342
354
  content — key/value fields, bullet lists, and multiline blocks for
package/README.md CHANGED
@@ -51,9 +51,9 @@ dsh --profile tui
51
51
  `▸ 已思考 · N 行`,可单独展开;思考过程中也能实时展开/收起查看原文;
52
52
  - 工作区支持 markdown 渲染:多级标题(H1 放大/下划线、H2 下划线、H3 着色)、
53
53
  粗体、斜体、行内代码、代码块、列表、引用与链接;模型最终回复以粗体白色显示;
54
- - 工具调用卡片化:彩色状态点(运行黄 / 成功绿 / 失败红)、shell 命令友好展示、
55
- 编辑工具 git 风格 diff(`-` 浅红底 / `+` 浅绿底 / 文件统计,编辑卡片默认展开且
56
- diff 内容不截断)、JSON 参数与结果自动转可读内容;
54
+ - 工具调用卡片化:标题与结果文字跟随执行状态(运行黄 / 成功绿 / 失败红),
55
+ shell 命令浅灰显示、状态点同色;编辑工具 git 风格 diff(`-` 暗红底 / `+` 暗绿底 /
56
+ 文件统计,编辑卡片默认展开且 diff 内容不截断)、JSON 参数与结果自动转可读内容;
57
57
  - 转录区滚动回看(`PgUp`/`PgDn`、鼠标滚轮),点击思考/工具标题行直接展开收起;
58
58
  - 输入框下方两行底栏:第一行链路芯片 + 按宽度丢组的会话数字(轮次、入/出 token、速度);
59
59
  第二行只留一个活动词(运行中 / 工具 N / 子代理 N / 压缩中…),身份收到右侧;
@@ -79,10 +79,18 @@ dsh --profile tui
79
79
  可选:本机已有 SuperGrok / grok-bridge token 时再装配套 OAuth:
80
80
 
81
81
  ```bash
82
- dsh plugin --profile tui add github:cyjyyd/dsh-llm-xai-oauth
83
- dsh plugin --profile headless add github:cyjyyd/dsh-llm-xai-oauth
82
+ dsh plugin --profile tui add dsh-llm-xai-oauth
83
+ dsh plugin --profile headless add dsh-llm-xai-oauth
84
84
  ```
85
85
 
86
+ SuperGrok 的 access token 大约 1 小时过期。TUI 打开时会刷新即将过期的 token,`/usage` 遇到 401 也会再刷一次。机器长时间不开 dsh 时,请另开刷新进程,否则一打开就是 401:
87
+
88
+ ```bash
89
+ npx dsh-llm-xai-oauth daemon --install
90
+ ```
91
+
92
+ 说明见 [dsh-llm-xai-oauth](https://github.com/cyjyyd/dsh-llm-xai-oauth)。
93
+
86
94
  先确认链路再开 TUI(无 TTY 时 TUI 会直接退出):
87
95
 
88
96
  ```bash
@@ -213,9 +221,10 @@ dsh --profile tui --no-color
213
221
  每个提供商上次的模型和思考强度会分开记住。`/setup` 只新增或更新当前这条
214
222
  API Key 提供商,不会冲掉其它路由。SuperGrok / X Premium 走本机 OAuth,不需要填 Key。
215
223
 
216
- 子代理默认跟随父会话的提供方,并尽量选同一家的轻量模型:DeepSeek 用
217
- `deepseek-v4-flash` / `deepseek-v4-flash-vision-exp`,xAI 用 `grok-4.5`。
218
- `/model` 或 `/setup` 换提供商(OAuth / API Key 都一样)时会自动同步子代理:
224
+ 子代理默认跟随父会话的提供方,并尽量选同一家的轻量模型:按父会话所选模型名
225
+ 近似匹配,`flash` 结尾的优先——DeepSeek `deepseek-v4-flash`,xAI 用
226
+ `grok-4.5`。`/model` 或 `/provider` 换提供商(OAuth / API Key 都一样)时会
227
+ **自动落盘**子代理模型(不弹窗;想手动改再用 `/submodel`):
219
228
 
220
229
  - `/submodel [model-id]`:打开子代理模型选择器;带参数时直接指定模型;
221
230
  - `/subeffort`:选择子代理思考强度,或恢复为“跟随提供商默认”;
package/lib/index.js CHANGED
@@ -5,15 +5,35 @@
5
5
  * subagents, sandbox approvals) is the same one the web surface uses.
6
6
  */
7
7
  import { installModelSelection } from '@deepseek-ai/dsh-agent';
8
- import { errorChain } from '@deepseek-ai/dsh-llm';
8
+ import { errorChain, ReasoningEffortId } from '@deepseek-ai/dsh-llm';
9
9
  import { SessionId } from '@deepseek-ai/dsh-session';
10
10
  import { randomUUID } from 'node:crypto';
11
+ import { readFileSync } from 'node:fs';
12
+ import { homedir } from 'node:os';
13
+ import { join } from 'node:path';
14
+ import yaml from 'js-yaml';
15
+ /** Read the user's `agent-default-model` straight from `$DSH_HOME/settings.yaml`. */
16
+ function readAgentDefaultFromFile() {
17
+ const home = process.env.DSH_HOME ?? join(homedir(), '.dsh');
18
+ try {
19
+ const parsed = yaml.load(readFileSync(join(home, 'settings.yaml'), 'utf8'));
20
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed))
21
+ return undefined;
22
+ const section = parsed['agent-default-model'];
23
+ return section !== null && typeof section === 'object' && !Array.isArray(section)
24
+ ? section
25
+ : undefined;
26
+ }
27
+ catch {
28
+ return undefined;
29
+ }
30
+ }
11
31
  import { showSessionPicker } from './picker.js';
12
32
  import { mountTui } from './tui.js';
13
33
  import { defaultReasoningEffort } from './reasoning.js';
14
34
  import { createSubagentSelection } from './subagent-model.js';
15
35
  import { acquireSessionLock, releaseSessionLock, sessionLockDisabled } from './session-lock.js';
16
- import { installRouteMemory } from './route-memory.js';
36
+ import { installRouteMemory, latestRememberedRoute, parseRouteMemory } from './route-memory.js';
17
37
  export const name = 'ssh-tui';
18
38
  /** Core services required before the terminal channel can drive an agent. */
19
39
  export const inject = ['agents', 'agentDefaultModel'];
@@ -73,27 +93,57 @@ export function apply(ctx, config) {
73
93
  if (agents === undefined)
74
94
  throw new Error('dsh-ssh-tui: agents service is unavailable');
75
95
  const defaultModel = ctx.get('agentDefaultModel');
76
- const savedSelection = defaultModel?.currentSelection();
96
+ const serviceSaved = defaultModel?.currentSelection();
97
+ // The settings document / on-disk file is the authoritative source for a
98
+ // default that must survive a restart. The agentDefaultModel service
99
+ // (or a duplicate settings instance) can report a stale in-memory
100
+ // selection, so prefer the file when it carries a user section.
101
+ const settingsSvc = ctx.get('settings');
102
+ const doc = settingsSvc?.document;
103
+ const docSection = doc !== null && typeof doc === 'object' && !Array.isArray(doc)
104
+ ? doc['agent-default-model']
105
+ : undefined;
106
+ const fileSection = readAgentDefaultFromFile();
107
+ const authoritative = (fileSection ?? docSection);
108
+ const savedSelection = authoritative !== undefined
109
+ && typeof authoritative.provider === 'string'
110
+ && typeof authoritative.model === 'string'
111
+ ? {
112
+ provider: authoritative.provider,
113
+ model: authoritative.model,
114
+ ...(typeof authoritative.reasoningEffort === 'string'
115
+ ? { reasoningEffort: ReasoningEffortId(authoritative.reasoningEffort) }
116
+ : {}),
117
+ }
118
+ : serviceSaved;
119
+ const hasUserDefaultSection = fileSection !== undefined || docSection !== undefined;
120
+ const rememberedFallback = !hasUserDefaultSection
121
+ ? latestRememberedRoute(parseRouteMemory(settingsSvc?.document?.['ssh-tui-routes']))
122
+ : undefined;
77
123
  // An explicit in-process change (/setup or /model) wins over launch-time
78
124
  // CLI overrides for every session created or resumed later in this process.
79
125
  const provider = liveSelection?.provider
80
126
  ?? config.provider
81
127
  ?? savedSelection?.provider
128
+ ?? rememberedFallback?.provider
82
129
  ?? 'deepseek-official';
83
130
  const model = liveSelection?.model
84
131
  ?? config.model
85
132
  ?? savedSelection?.model
133
+ ?? rememberedFallback?.model
86
134
  ?? 'deepseek-v4-flash';
87
135
  // Reasoning effort is only meaningful for the exact provider/model it
88
136
  // belongs to. CLI overrides that change either route must not inherit the
89
137
  // saved effort of a different model.
90
138
  let reasoningEffort = liveSelection?.reasoningEffort;
91
139
  if (reasoningEffort === undefined && liveSelection === undefined) {
92
- const sameSavedRoute = savedSelection !== undefined
93
- && (config.provider === undefined || config.provider === savedSelection.provider)
94
- && (config.model === undefined || config.model === savedSelection.model);
95
- if (sameSavedRoute)
96
- reasoningEffort = savedSelection.reasoningEffort;
140
+ const sameSavedRoute = (savedSelection ?? rememberedFallback) !== undefined
141
+ && (config.provider === undefined || config.provider === (savedSelection ?? rememberedFallback)?.provider)
142
+ && (config.model === undefined || config.model === (savedSelection ?? rememberedFallback)?.model);
143
+ if (sameSavedRoute) {
144
+ const rawEffort = (savedSelection ?? rememberedFallback)?.reasoningEffort;
145
+ reasoningEffort = rawEffort === undefined ? undefined : ReasoningEffortId(String(rawEffort));
146
+ }
97
147
  }
98
148
  // OpenCode / third-party (llm-pi-ai) routes carry no adapter-level
99
149
  // reasoning default, so default a supported effort ourselves when none is
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,qBAAqB,EAAiE,MAAM,wBAAwB,CAAA;AAG7H,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAsB,MAAM,UAAU,CAAA;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAC/F,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEtD,MAAM,CAAC,MAAM,IAAI,GAAG,SAAS,CAAA;AAE7B,6EAA6E;AAC7E,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAA;AAqBrD;;;;;GAKG;AACH,MAAM,UAAU,KAAK,CAAC,GAAY,EAAE,MAAc;IAChD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAA;IAChG,CAAC;IACD,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAA;IACtD,kBAAkB,CAAC,GAAG,CAAC,CAAA;IACvB,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;QACd,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,IAAI,SAAS,GAAG,KAAK,CAAA;QACrB,IAAI,MAA+B,CAAA;QACnC,IAAI,UAAqC,CAAA;QACzC,IAAI,mBAAuC,CAAA;QAE3C,MAAM,eAAe,GAAG,KAAK,IAAmB,EAAE;YAChD,MAAM,IAAI,GAAG,mBAAmB,CAAA;YAChC,mBAAmB,GAAG,SAAS,CAAA;YAC/B,IAAI,IAAI,KAAK,SAAS;gBAAE,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAA;QACxD,CAAC,CAAA;QAED,MAAM,eAAe,GAAG,KAAK,EAAE,SAAiB,EAAiB,EAAE;YACjE,IAAI,mBAAmB,EAAE;gBAAE,OAAM;YACjC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE;gBACnD,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG;aAC5C,CAAC,CAAA;YACF,mBAAmB,GAAG,IAAI,CAAA;QAC5B,CAAC,CAAA;QACD,yEAAyE;QACzE,4EAA4E;QAC5E,IAAI,aAAyC,CAAA;QAE7C,iEAAiE;QACjE,MAAM,UAAU,GAAG,CAAC,SAAiB,EAAU,EAAE;YAC/C,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAuB,CAAA;YACnE,MAAM,MAAM,GAAG,WAAW,CAAA;YAC1B,MAAM,WAAW,GAAG,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;YACvD,IAAI,QAAQ,KAAK,SAAS,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;gBACxD,IAAI,IAAI,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrC,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,SAAS,EAAE,CAAA;gBACxE,CAAC;YACH,CAAC;YACD,OAAO,sDAAsD,SAAS,EAAE,CAAA;QAC1E,CAAC,CAAA;QAED,MAAM,KAAK,GAAG,KAAK,EAAE,SAAoB,EAAE,MAAe,EAAiB,EAAE;YAC3E,MAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAA;YAChC,IAAI,QAAQ;gBAAE,OAAM;YACpB,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAChC,IAAI,MAAM,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;YACvF,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;YACjD,MAAM,cAAc,GAAG,YAAY,EAAE,gBAAgB,EAAE,CAAA;YAEvD,yEAAyE;YACzE,4EAA4E;YAC5E,MAAM,QAAQ,GAAG,aAAa,EAAE,QAAQ;mBACnC,MAAM,CAAC,QAAQ;mBACf,cAAc,EAAE,QAAQ;mBACxB,mBAAmB,CAAA;YACxB,MAAM,KAAK,GAAG,aAAa,EAAE,KAAK;mBAC7B,MAAM,CAAC,KAAK;mBACZ,cAAc,EAAE,KAAK;mBACrB,mBAAmB,CAAA;YAExB,sEAAsE;YACtE,0EAA0E;YAC1E,qCAAqC;YACrC,IAAI,eAAe,GAAG,aAAa,EAAE,eAAe,CAAA;YACpD,IAAI,eAAe,KAAK,SAAS,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;gBACjE,MAAM,cAAc,GAAG,cAAc,KAAK,SAAS;uBAC9C,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,cAAc,CAAC,QAAQ,CAAC;uBAC9E,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,cAAc,CAAC,KAAK,CAAC,CAAA;gBAC1E,IAAI,cAAc;oBAAE,eAAe,GAAG,cAAc,CAAC,eAAe,CAAA;YACtE,CAAC;YACD,mEAAmE;YACnE,0EAA0E;YAC1E,wEAAwE;YACxE,iDAAiD;YACjD,IAAI,eAAe,KAAK,SAAS,IAAI,QAAQ,KAAK,mBAAmB,EAAE,CAAC;gBACtE,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;gBAC1B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBACtB,eAAe,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;gBACtE,CAAC;YACH,CAAC;YAED,MAAM,kBAAkB,GAAmB;gBACzC,QAAQ;gBACR,KAAK;gBACL,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC;aAC9D,CAAA;YACD,MAAM,YAAY,GAAsB;gBACtC,OAAO,EAAE,kBAAkB;gBAC3B,SAAS,EAAE,SAAS;aACrB,CAAA;YACD,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;YAC5C,MAAM,YAAY,GAAG;gBACnB,QAAQ;gBACR,KAAK;gBACL,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC;aAC9D,CAAA;YACD,MAAM,KAAK,GAAG,KAAK,EAAE,QAAiB,EAAiB,EAAE;gBACvD,qBAAqB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;gBAC7C,MAAM,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;YACrC,CAAC,CAAA;YACD,MAAM,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;YACxC,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM;oBACb,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;oBAC1E,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAA;YAC3F,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,MAAM,eAAe,EAAE,CAAA;gBACvB,MAAM,KAAK,CAAA;YACb,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;gBACtB,MAAM,eAAe,EAAE,CAAA;gBACvB,OAAM;YACR,CAAC;YACD,MAAM,QAAQ,GAAG,YAAY,EAAE,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,YAAY,EAAE,SAAS,CAAA;YAC1F,IAAI,UAAU,GAAG,QAAQ,CAAA;YACzB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;oBACpD,IAAI,MAAM,EAAE,IAAI,KAAK,SAAS;wBAAE,UAAU,GAAG,MAAM,CAAC,IAAI,CAAA;gBAC1D,CAAC;gBAAC,MAAM,CAAC;oBACP,uBAAuB;gBACzB,CAAC;YACH,CAAC;YACD,UAAU,GAAG,QAAQ,CAAC,GAAG,EAAE;gBACzB,GAAG,MAAM;gBACT,YAAY,EAAE,KAAK;gBACnB,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC;gBAC5B,MAAM;gBACN,QAAQ;gBACR,KAAK;gBACL,YAAY;gBACZ,iBAAiB;gBACjB,QAAQ;gBACR,UAAU;gBACV,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACtC,eAAe,EAAE,QAAQ;gBACzB,kBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE;oBAC3B,aAAa,GAAG,IAAI,CAAA;gBACtB,CAAC;aACF,CAAC,CAAA;QACJ,CAAC,CAAA;QAED,6EAA6E;QAC7E,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAiB,EAAE;YACvD,IAAI,SAAS,IAAI,QAAQ;gBAAE,OAAM;YACjC,SAAS,GAAG,IAAI,CAAA;YAChB,IAAI,CAAC;gBACH,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;oBAC7B,MAAM,UAAU,CAAC,OAAO,EAAE,CAAA;oBAC1B,UAAU,GAAG,SAAS,CAAA;gBACxB,CAAC;gBACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;oBACtB,MAAM,GAAG,SAAS,CAAA;gBACpB,CAAC;gBACD,MAAM,eAAe,EAAE,CAAA;gBACvB,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAA;YACtC,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,MAAM,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBACpG,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;gBAC/B,IAAI,IAAI,KAAK,SAAS;oBAAE,IAAI,CAAC,CAAC,CAAC,CAAA;;oBAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACtB,CAAC;oBAAS,CAAC;gBACT,SAAS,GAAG,KAAK,CAAA;YACnB,CAAC;QACH,CAAC,CAAA;QAED,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAA;QACzC,IAAI,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAA;QACvC,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;YACrC,IAAI,MAAM,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;gBACjC,MAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAA;gBAChC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;gBACvF,IAAI,QAAQ;oBAAE,OAAM;gBACpB,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;oBACpB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;oBAC/B,IAAI,IAAI,KAAK,SAAS;wBAAE,IAAI,CAAC,CAAC,CAAC,CAAA;;wBAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;oBACpB,OAAM;gBACR,CAAC;gBACD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC7B,gBAAgB,GAAG,MAAM,CAAC,EAAE,CAAA;oBAC5B,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;gBACzC,CAAC;qBAAM,CAAC;oBACN,oEAAoE;oBACpE,mEAAmE;oBACnE,sBAAsB;oBACtB,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,KAAK,EAAE;wBACvC,CAAC,CAAC,gBAAgB,UAAU,EAAE,EAAE;wBAChC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAA;oBACpB,gBAAgB,GAAG,SAAS,CAAA;oBAC5B,MAAM,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAA;gBAC1C,CAAC;gBACD,OAAM;YACR,CAAC;YACD,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,CAAA;QAClE,CAAC,CAAA;QAED,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACnC,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB;gBAC5E,CAAC,CAAC,KAAK,CAAC,OAAO;gBACf,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;YACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,gBAAgB,uBAAuB,MAAM,IAAI,CAAC,CAAA;YAChG,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YAC/B,IAAI,IAAI,KAAK,SAAS;gBAAE,IAAI,CAAC,CAAC,CAAC,CAAA;;gBAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACtB,CAAC,CAAC,CAAA;QAEF,OAAO,KAAK,IAAmB,EAAE;YAC/B,QAAQ,GAAG,IAAI,CAAA;YACf,WAAW,CAAC,KAAK,EAAE,CAAA;YACnB,MAAM,UAAU,EAAE,OAAO,EAAE,CAAA;YAC3B,MAAM,MAAM,EAAE,OAAO,EAAE,CAAA;YACvB,MAAM,eAAe,EAAE,CAAA;QACzB,CAAC,CAAA;IACH,CAAC,EAAE,SAAS,CAAC,CAAA;AACf,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,qBAAqB,EAAiE,MAAM,wBAAwB,CAAA;AAG7H,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAEpE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,IAAI,MAAM,SAAS,CAAA;AAE1B,qFAAqF;AACrF,SAAS,wBAAwB;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAA;IAC5D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,MAAM,CAAC,CAAY,CAAA;QACtF,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,SAAS,CAAA;QAC5F,MAAM,OAAO,GAAI,MAAkC,CAAC,qBAAqB,CAAC,CAAA;QAC1E,OAAO,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAC/E,CAAC,CAAC,OAAkC;YACpC,CAAC,CAAC,SAAS,CAAA;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AACD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAsB,MAAM,UAAU,CAAA;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAC/F,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,gBAAgB,EAA0B,MAAM,mBAAmB,CAAA;AAGvH,MAAM,CAAC,MAAM,IAAI,GAAG,SAAS,CAAA;AAE7B,6EAA6E;AAC7E,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAA;AAqBrD;;;;;GAKG;AACH,MAAM,UAAU,KAAK,CAAC,GAAY,EAAE,MAAc;IAChD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAA;IAChG,CAAC;IACD,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAA;IACtD,kBAAkB,CAAC,GAAG,CAAC,CAAA;IACvB,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;QACd,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,IAAI,SAAS,GAAG,KAAK,CAAA;QACrB,IAAI,MAA+B,CAAA;QACnC,IAAI,UAAqC,CAAA;QACzC,IAAI,mBAAuC,CAAA;QAE3C,MAAM,eAAe,GAAG,KAAK,IAAmB,EAAE;YAChD,MAAM,IAAI,GAAG,mBAAmB,CAAA;YAChC,mBAAmB,GAAG,SAAS,CAAA;YAC/B,IAAI,IAAI,KAAK,SAAS;gBAAE,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAA;QACxD,CAAC,CAAA;QAED,MAAM,eAAe,GAAG,KAAK,EAAE,SAAiB,EAAiB,EAAE;YACjE,IAAI,mBAAmB,EAAE;gBAAE,OAAM;YACjC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE;gBACnD,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG;aAC5C,CAAC,CAAA;YACF,mBAAmB,GAAG,IAAI,CAAA;QAC5B,CAAC,CAAA;QACD,yEAAyE;QACzE,4EAA4E;QAC5E,IAAI,aAAyC,CAAA;QAE7C,iEAAiE;QACjE,MAAM,UAAU,GAAG,CAAC,SAAiB,EAAU,EAAE;YAC/C,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAuB,CAAA;YACnE,MAAM,MAAM,GAAG,WAAW,CAAA;YAC1B,MAAM,WAAW,GAAG,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;YACvD,IAAI,QAAQ,KAAK,SAAS,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;gBACxD,IAAI,IAAI,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrC,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,SAAS,EAAE,CAAA;gBACxE,CAAC;YACH,CAAC;YACD,OAAO,sDAAsD,SAAS,EAAE,CAAA;QAC1E,CAAC,CAAA;QAED,MAAM,KAAK,GAAG,KAAK,EAAE,SAAoB,EAAE,MAAe,EAAiB,EAAE;YAC3E,MAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAA;YAChC,IAAI,QAAQ;gBAAE,OAAM;YACpB,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAChC,IAAI,MAAM,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;YACvF,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;YACjD,MAAM,YAAY,GAAG,YAAY,EAAE,gBAAgB,EAAE,CAAA;YACrD,yEAAyE;YACzE,qEAAqE;YACrE,kEAAkE;YAClE,gEAAgE;YAChE,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,CAEzB,CAAA;YACb,MAAM,GAAG,GAAG,WAAW,EAAE,QAAQ,CAAA;YACjC,MAAM,UAAU,GAAG,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;gBAC/E,CAAC,CAAE,GAA+B,CAAC,qBAAqB,CAAC;gBACzD,CAAC,CAAC,SAAS,CAAA;YACb,MAAM,WAAW,GAAG,wBAAwB,EAAE,CAAA;YAC9C,MAAM,aAAa,GAAG,CAAC,WAAW,IAAI,UAAU,CAEnC,CAAA;YACb,MAAM,cAAc,GAClB,aAAa,KAAK,SAAS;mBACtB,OAAO,aAAa,CAAC,QAAQ,KAAK,QAAQ;mBAC1C,OAAO,aAAa,CAAC,KAAK,KAAK,QAAQ;gBAC1C,CAAC,CAAC;oBACE,QAAQ,EAAE,aAAa,CAAC,QAAQ;oBAChC,KAAK,EAAE,aAAa,CAAC,KAAK;oBAC1B,GAAG,CAAC,OAAO,aAAa,CAAC,eAAe,KAAK,QAAQ;wBACnD,CAAC,CAAC,EAAE,eAAe,EAAE,iBAAiB,CAAC,aAAa,CAAC,eAAe,CAAC,EAAE;wBACvE,CAAC,CAAC,EAAE,CAAC;iBACR;gBACH,CAAC,CAAC,YAAY,CAAA;YAClB,MAAM,qBAAqB,GAAG,WAAW,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,CAAA;YACnF,MAAM,kBAAkB,GAAG,CAAC,qBAAqB;gBAC/C,CAAC,CAAC,qBAAqB,CAAC,gBAAgB,CACnC,WAAkE,EAAE,QAAQ,EAAE,CAAC,gBAAgB,CAAC,CAClG,CAAC;gBACJ,CAAC,CAAC,SAAS,CAAA;YAEb,yEAAyE;YACzE,4EAA4E;YAC5E,MAAM,QAAQ,GAAG,aAAa,EAAE,QAAQ;mBACnC,MAAM,CAAC,QAAQ;mBACf,cAAc,EAAE,QAAQ;mBACxB,kBAAkB,EAAE,QAAQ;mBAC5B,mBAAmB,CAAA;YACxB,MAAM,KAAK,GAAG,aAAa,EAAE,KAAK;mBAC7B,MAAM,CAAC,KAAK;mBACZ,cAAc,EAAE,KAAK;mBACrB,kBAAkB,EAAE,KAAK;mBACzB,mBAAmB,CAAA;YAExB,sEAAsE;YACtE,0EAA0E;YAC1E,qCAAqC;YACrC,IAAI,eAAe,GAAG,aAAa,EAAE,eAAe,CAAA;YACpD,IAAI,eAAe,KAAK,SAAS,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;gBACjE,MAAM,cAAc,GAAG,CAAC,cAAc,IAAI,kBAAkB,CAAC,KAAK,SAAS;uBACtE,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,cAAc,IAAI,kBAAkB,CAAC,EAAE,QAAQ,CAAC;uBACvG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,cAAc,IAAI,kBAAkB,CAAC,EAAE,KAAK,CAAC,CAAA;gBACnG,IAAI,cAAc,EAAE,CAAC;oBACnB,MAAM,SAAS,GAAG,CAAC,cAAc,IAAI,kBAAkB,CAAC,EAAE,eAAe,CAAA;oBACzE,eAAe,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;gBAC9F,CAAC;YACH,CAAC;YACD,mEAAmE;YACnE,0EAA0E;YAC1E,wEAAwE;YACxE,iDAAiD;YACjD,IAAI,eAAe,KAAK,SAAS,IAAI,QAAQ,KAAK,mBAAmB,EAAE,CAAC;gBACtE,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;gBAC1B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBACtB,eAAe,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;gBACtE,CAAC;YACH,CAAC;YAED,MAAM,kBAAkB,GAAmB;gBACzC,QAAQ;gBACR,KAAK;gBACL,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC;aAC9D,CAAA;YACD,MAAM,YAAY,GAAsB;gBACtC,OAAO,EAAE,kBAAkB;gBAC3B,SAAS,EAAE,SAAS;aACrB,CAAA;YACD,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;YAC5C,MAAM,YAAY,GAAG;gBACnB,QAAQ;gBACR,KAAK;gBACL,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC;aAC9D,CAAA;YACD,MAAM,KAAK,GAAG,KAAK,EAAE,QAAiB,EAAiB,EAAE;gBACvD,qBAAqB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;gBAC7C,MAAM,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;YACrC,CAAC,CAAA;YACD,MAAM,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;YACxC,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM;oBACb,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;oBAC1E,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAA;YAC3F,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,MAAM,eAAe,EAAE,CAAA;gBACvB,MAAM,KAAK,CAAA;YACb,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;gBACtB,MAAM,eAAe,EAAE,CAAA;gBACvB,OAAM;YACR,CAAC;YACD,MAAM,QAAQ,GAAG,YAAY,EAAE,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,YAAY,EAAE,SAAS,CAAA;YAC1F,IAAI,UAAU,GAAG,QAAQ,CAAA;YACzB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;oBACpD,IAAI,MAAM,EAAE,IAAI,KAAK,SAAS;wBAAE,UAAU,GAAG,MAAM,CAAC,IAAI,CAAA;gBAC1D,CAAC;gBAAC,MAAM,CAAC;oBACP,uBAAuB;gBACzB,CAAC;YACH,CAAC;YACD,UAAU,GAAG,QAAQ,CAAC,GAAG,EAAE;gBACzB,GAAG,MAAM;gBACT,YAAY,EAAE,KAAK;gBACnB,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC;gBAC5B,MAAM;gBACN,QAAQ;gBACR,KAAK;gBACL,YAAY;gBACZ,iBAAiB;gBACjB,QAAQ;gBACR,UAAU;gBACV,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACtC,eAAe,EAAE,QAAQ;gBACzB,kBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE;oBAC3B,aAAa,GAAG,IAAI,CAAA;gBACtB,CAAC;aACF,CAAC,CAAA;QACJ,CAAC,CAAA;QAED,6EAA6E;QAC7E,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAiB,EAAE;YACvD,IAAI,SAAS,IAAI,QAAQ;gBAAE,OAAM;YACjC,SAAS,GAAG,IAAI,CAAA;YAChB,IAAI,CAAC;gBACH,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;oBAC7B,MAAM,UAAU,CAAC,OAAO,EAAE,CAAA;oBAC1B,UAAU,GAAG,SAAS,CAAA;gBACxB,CAAC;gBACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;oBACtB,MAAM,GAAG,SAAS,CAAA;gBACpB,CAAC;gBACD,MAAM,eAAe,EAAE,CAAA;gBACvB,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAA;YACtC,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,MAAM,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBACpG,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;gBAC/B,IAAI,IAAI,KAAK,SAAS;oBAAE,IAAI,CAAC,CAAC,CAAC,CAAA;;oBAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACtB,CAAC;oBAAS,CAAC;gBACT,SAAS,GAAG,KAAK,CAAA;YACnB,CAAC;QACH,CAAC,CAAA;QAED,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAA;QACzC,IAAI,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAA;QACvC,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;YACrC,IAAI,MAAM,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;gBACjC,MAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAA;gBAChC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;gBACvF,IAAI,QAAQ;oBAAE,OAAM;gBACpB,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;oBACpB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;oBAC/B,IAAI,IAAI,KAAK,SAAS;wBAAE,IAAI,CAAC,CAAC,CAAC,CAAA;;wBAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;oBACpB,OAAM;gBACR,CAAC;gBACD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC7B,gBAAgB,GAAG,MAAM,CAAC,EAAE,CAAA;oBAC5B,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;gBACzC,CAAC;qBAAM,CAAC;oBACN,oEAAoE;oBACpE,mEAAmE;oBACnE,sBAAsB;oBACtB,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,KAAK,EAAE;wBACvC,CAAC,CAAC,gBAAgB,UAAU,EAAE,EAAE;wBAChC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAA;oBACpB,gBAAgB,GAAG,SAAS,CAAA;oBAC5B,MAAM,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAA;gBAC1C,CAAC;gBACD,OAAM;YACR,CAAC;YACD,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,CAAA;QAClE,CAAC,CAAA;QAED,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACnC,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB;gBAC5E,CAAC,CAAC,KAAK,CAAC,OAAO;gBACf,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;YACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,gBAAgB,uBAAuB,MAAM,IAAI,CAAC,CAAA;YAChG,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YAC/B,IAAI,IAAI,KAAK,SAAS;gBAAE,IAAI,CAAC,CAAC,CAAC,CAAA;;gBAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACtB,CAAC,CAAC,CAAA;QAEF,OAAO,KAAK,IAAmB,EAAE;YAC/B,QAAQ,GAAG,IAAI,CAAA;YACf,WAAW,CAAC,KAAK,EAAE,CAAA;YACnB,MAAM,UAAU,EAAE,OAAO,EAAE,CAAA;YAC3B,MAAM,MAAM,EAAE,OAAO,EAAE,CAAA;YACvB,MAAM,eAAe,EAAE,CAAA;QACzB,CAAC,CAAA;IACH,CAAC,EAAE,SAAS,CAAC,CAAA;AACf,CAAC"}
@@ -10,6 +10,7 @@ export const ROUTE_MEMORY_SCHEMA = z.object({
10
10
  providers: z.dict(z.object({
11
11
  model: z.string(),
12
12
  reasoningEffort: z.string().default(''),
13
+ updatedAt: z.number(),
13
14
  })).default({}),
14
15
  });
15
16
  export function parseRouteMemory(raw) {
@@ -25,13 +26,28 @@ export function parseRouteMemory(raw) {
25
26
  if (model === '')
26
27
  continue;
27
28
  const effort = typeof row.reasoningEffort === 'string' ? row.reasoningEffort.trim() : '';
28
- out[id] = effort === '' ? { model } : { model, reasoningEffort: effort };
29
+ const updatedAt = typeof row.updatedAt === 'number' && Number.isFinite(row.updatedAt) ? row.updatedAt : 0;
30
+ out[id] = {
31
+ model,
32
+ ...(effort === '' ? {} : { reasoningEffort: effort }),
33
+ ...(updatedAt > 0 ? { updatedAt } : {}),
34
+ };
29
35
  }
30
36
  return out;
31
37
  }
32
38
  export function rememberedRouteFor(memory, provider) {
33
39
  return memory[provider.trim()];
34
40
  }
41
+ /** The most recently persisted route (highest updatedAt), or undefined. */
42
+ export function latestRememberedRoute(memory) {
43
+ let best;
44
+ for (const [provider, route] of Object.entries(memory)) {
45
+ if (best === undefined || (route.updatedAt ?? 0) > (best.updatedAt ?? 0)) {
46
+ best = { ...route, provider };
47
+ }
48
+ }
49
+ return best;
50
+ }
35
51
  /** Register the route-memory settings section so /model and /provider can persist. */
36
52
  export function installRouteMemory(ctx) {
37
53
  installSettingsSection(ctx, ROUTE_MEMORY_NAMESPACE, ROUTE_MEMORY_SCHEMA, {
@@ -47,9 +63,12 @@ export function upsertRememberedRoute(memory, provider, route) {
47
63
  return memory;
48
64
  return {
49
65
  ...memory,
50
- [id]: route.reasoningEffort === undefined || route.reasoningEffort === ''
51
- ? { model: route.model }
52
- : { model: route.model, reasoningEffort: route.reasoningEffort },
66
+ [id]: {
67
+ ...(route.reasoningEffort === undefined || route.reasoningEffort === ''
68
+ ? { model: route.model }
69
+ : { model: route.model, reasoningEffort: route.reasoningEffort }),
70
+ updatedAt: Date.now(),
71
+ },
53
72
  };
54
73
  }
55
74
  //# sourceMappingURL=route-memory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route-memory.js","sourceRoot":"","sources":["../src/route-memory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAExC,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAErF,MAAM,CAAC,MAAM,sBAAsB,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;AAEzE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QACzB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;KACxC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAChB,CAAC,CAAA;AASF,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAA;IAC5E,MAAM,GAAG,GAAmB,EAAE,CAAA;IAC9B,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAA8B,CAAC,EAAE,CAAC;QAC/E,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC1B,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,SAAQ;QAC9F,MAAM,GAAG,GAAG,KAAgC,CAAA;QAC5C,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACnE,IAAI,KAAK,KAAK,EAAE;YAAE,SAAQ;QAC1B,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACxF,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,CAAA;IAC1E,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAsB,EAAE,QAAgB;IACzE,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;AAChC,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,sBAAsB,CAAC,GAAG,EAAE,sBAAsB,EAAE,mBAAmB,EAAE;QACvE,SAAS,EAAE,EAAE;KACd,EAAE;QACD,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC;QACnB,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;KACnB,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAAsB,EACtB,QAAgB,EAChB,KAAsB;IAEtB,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC1B,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,MAAM,CAAA;IACzD,OAAO;QACL,GAAG,MAAM;QACT,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,eAAe,KAAK,SAAS,IAAI,KAAK,CAAC,eAAe,KAAK,EAAE;YACvE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;YACxB,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE;KACnE,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"route-memory.js","sourceRoot":"","sources":["../src/route-memory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAExC,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAErF,MAAM,CAAC,MAAM,sBAAsB,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;AAEzE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QACzB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;KACtB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAChB,CAAC,CAAA;AAWF,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAA;IAC5E,MAAM,GAAG,GAAmB,EAAE,CAAA;IAC9B,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAA8B,CAAC,EAAE,CAAC;QAC/E,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC1B,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,SAAQ;QAC9F,MAAM,GAAG,GAAG,KAAgC,CAAA;QAC5C,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACnE,IAAI,KAAK,KAAK,EAAE;YAAE,SAAQ;QAC1B,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACxF,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;QACzG,GAAG,CAAC,EAAE,CAAC,GAAG;YACR,KAAK;YACL,GAAG,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC;YACrD,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxC,CAAA;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAsB,EAAE,QAAgB;IACzE,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;AAChC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,qBAAqB,CACnC,MAAsB;IAEtB,IAAI,IAA0D,CAAA;IAC9D,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC;YACzE,IAAI,GAAG,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,CAAA;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,sBAAsB,CAAC,GAAG,EAAE,sBAAsB,EAAE,mBAAmB,EAAE;QACvE,SAAS,EAAE,EAAE;KACd,EAAE;QACD,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC;QACnB,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;KACnB,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAAsB,EACtB,QAAgB,EAChB,KAAsB;IAEtB,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC1B,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,MAAM,CAAA;IACzD,OAAO;QACL,GAAG,MAAM;QACT,CAAC,EAAE,CAAC,EAAE;YACJ,GAAG,CAAC,KAAK,CAAC,eAAe,KAAK,SAAS,IAAI,KAAK,CAAC,eAAe,KAAK,EAAE;gBACrE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;gBACxB,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC;YACnE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB;KACF,CAAA;AACH,CAAC"}
@@ -33,26 +33,50 @@ function modelLooksLike(model, markers) {
33
33
  const id = model.trim().toLowerCase();
34
34
  return markers.some(marker => id.includes(marker));
35
35
  }
36
+ /** Length of the shared leading characters between two model ids. */
37
+ function commonPrefixLength(a, b) {
38
+ let index = 0;
39
+ while (index < a.length && index < b.length && a[index] === b[index])
40
+ index += 1;
41
+ return index;
42
+ }
43
+ function isFlashLike(id) {
44
+ return id.endsWith('flash') || /[-_]flash(?:[-_]|$)/u.test(id);
45
+ }
36
46
  /**
37
47
  * Rank a listed model for automatic subagent selection. Lower is better:
38
- * exact preferred id, then flash/vision-lite, then other same-family ids.
48
+ * exact provider default first, then the parent-selected model, then a
49
+ * flash-like id close to the parent's name (same series), then the rest.
39
50
  */
40
- function scoreSubagentCandidate(model, preferred) {
51
+ function scoreSubagentCandidate(model, preferred, parentModel) {
41
52
  const id = model.trim().toLowerCase();
42
- const exact = preferred.findIndex(item => item.toLowerCase() === id);
43
- if (exact >= 0)
44
- return exact;
45
- if (id.includes('flash') || id.includes('lite') || id.includes('mini') || id.includes('small'))
46
- return preferred.length;
53
+ const parent = parentModel?.trim().toLowerCase() ?? '';
54
+ const exactPreferred = preferred.findIndex(item => item.toLowerCase() === id);
55
+ if (exactPreferred >= 0)
56
+ return -100 + exactPreferred;
57
+ if (parent !== '' && id === parent)
58
+ return -88;
59
+ let score = isFlashLike(id) ? -70 : -50;
60
+ if (parent !== '') {
61
+ const shared = commonPrefixLength(id, parent);
62
+ if (shared >= 12)
63
+ score -= 10;
64
+ else if (shared >= 8)
65
+ score -= 4;
66
+ }
47
67
  if (id.includes('vision'))
48
- return preferred.length + 1;
49
- return preferred.length + 8;
68
+ score += 6;
69
+ if (id.includes('pro') || id.includes('max') || id.includes('4.6'))
70
+ score += 12;
71
+ return score;
50
72
  }
51
73
  /**
52
74
  * Choose the default subagent model for a parent provider, preferring a
53
- * same-family listed model over a leftover DeepSeek flash id.
75
+ * same-family listed model over a leftover DeepSeek flash id. When the
76
+ * parent's own model id is supplied, candidates closest to that name win,
77
+ * with flash-like ids ranked first.
54
78
  */
55
- export function defaultSubagentModelForProvider(provider, listed = []) {
79
+ export function defaultSubagentModelForProvider(provider, listed = [], parentModel) {
56
80
  const family = providerFamily(provider);
57
81
  const preferred = family === 'xai'
58
82
  ? [DEFAULT_XAI_SUBAGENT_MODEL, 'grok-4.5', 'grok-4.3', 'grok-4.6']
@@ -66,7 +90,8 @@ export function defaultSubagentModelForProvider(provider, listed = []) {
66
90
  : true);
67
91
  const pool = sameFamily.length > 0 ? sameFamily : unique;
68
92
  return [...pool].sort((a, b) => {
69
- const delta = scoreSubagentCandidate(a, preferred) - scoreSubagentCandidate(b, preferred);
93
+ const delta = scoreSubagentCandidate(a, preferred, parentModel)
94
+ - scoreSubagentCandidate(b, preferred, parentModel);
70
95
  return delta !== 0 ? delta : a.localeCompare(b);
71
96
  })[0] ?? (preferred[0] ?? unique[0] ?? DEFAULT_SUBAGENT_MODEL);
72
97
  }
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-model.js","sourceRoot":"","sources":["../src/subagent-model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subagent-model.js","sourceRoot":"","sources":["../src/subagent-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAExC,OAAO,EAAE,iBAAiB,EAA6C,MAAM,sBAAsB,CAAA;AACnG,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAErF,sEAAsE;AACtE,MAAM,CAAC,MAAM,2BAA2B,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,CAAA;AAEhF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,sBAAsB,GAAG,mBAAmB,CAAA;AAEzD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,0BAA0B,GAAG,UAAU,CAAA;AAEpD,mDAAmD;AACnD,MAAM,sBAAsB,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAU,CAAA;AAE1E,8CAA8C;AAC9C,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,KAAK,CAAU,CAAA;AAEnD,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACxC,IAAI,EAAE,KAAK,mBAAmB,IAAI,EAAE,KAAK,UAAU,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,UAAU,CAAA;IACpG,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAA;IAClG,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,OAA0B;IAC/D,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACrC,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;AACpD,CAAC;AAED,qEAAqE;AACrE,SAAS,kBAAkB,CAAC,CAAS,EAAE,CAAS;IAC9C,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,OAAO,KAAK,GAAG,CAAC,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;QAAE,KAAK,IAAI,CAAC,CAAA;IAChF,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,WAAW,CAAC,EAAU;IAC7B,OAAO,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAChE,CAAC;AAED;;;;GAIG;AACH,SAAS,sBAAsB,CAC7B,KAAa,EACb,SAA4B,EAC5B,WAA+B;IAE/B,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACrC,MAAM,MAAM,GAAG,WAAW,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,CAAA;IACtD,MAAM,cAAc,GAAG,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,CAAA;IAC7E,IAAI,cAAc,IAAI,CAAC;QAAE,OAAO,CAAC,GAAG,GAAG,cAAc,CAAA;IACrD,IAAI,MAAM,KAAK,EAAE,IAAI,EAAE,KAAK,MAAM;QAAE,OAAO,CAAC,EAAE,CAAA;IAC9C,IAAI,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACvC,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QAC7C,IAAI,MAAM,IAAI,EAAE;YAAE,KAAK,IAAI,EAAE,CAAA;aACxB,IAAI,MAAM,IAAI,CAAC;YAAE,KAAK,IAAI,CAAC,CAAA;IAClC,CAAC;IACD,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,KAAK,IAAI,CAAC,CAAA;IACrC,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,KAAK,IAAI,EAAE,CAAA;IAC/E,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,+BAA+B,CAC7C,QAAgB,EAChB,SAA4B,EAAE,EAC9B,WAAoB;IAEpB,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAA;IACvC,MAAM,SAAS,GAAG,MAAM,KAAK,KAAK;QAChC,CAAC,CAAC,CAAC,0BAA0B,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC;QAClE,CAAC,CAAC,MAAM,KAAK,UAAU;YACrB,CAAC,CAAC,CAAC,sBAAsB,EAAE,8BAA8B,EAAE,mBAAmB,CAAC;YAC/E,CAAC,CAAC,EAAE,CAAA;IACR,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;IAChF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CACpC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,EAAE,kBAAkB,CAAC;YACvD,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,EAAE,sBAAsB,CAAC;gBAClE,CAAC,CAAC,IAAI,CAAC,CAAA;QACb,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAA;QACxD,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,sBAAsB,CAAC,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC;kBAC3D,sBAAsB,CAAC,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;YACrD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAA;QACjD,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,sBAAsB,CAAC,CAAA;IAChE,CAAC;IACD,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,sBAAsB,CAAA;AAC/C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAC1C,QAAgB,EAChB,KAAa,EACb,SAA4B,EAAE;IAE9B,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IACvB,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,KAAK,CAAA;IAC3B,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAA;IACvC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IACjD,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,cAAc,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAA;IACnE,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,cAAc,CAAC,EAAE,EAAE,sBAAsB,CAAC,CAAA;IAC5E,mEAAmE;IACnE,IAAI,cAAc,CAAC,EAAE,EAAE,kBAAkB,CAAC;QAAE,OAAO,KAAK,CAAA;IACxD,OAAO,IAAI,CAAA;AACb,CAAC;AA2BD,qDAAqD;AACrD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,sBAAsB,CAAC;IACjD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;CAC5B,CAAC,CAAA;AAEF,oEAAoE;AACpE,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACvD,MAAM,GAAG,GAAG,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAqB,CAAA;IAC1F,OAAO;QACL,GAAG,CAAC,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE;YAChE,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE;YACnC,CAAC,CAAC,EAAE,CAAC;QACP,KAAK,EAAE,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;YAC7D,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;YAClB,CAAC,CAAC,sBAAsB;QAC1B,GAAG,CAAC,OAAO,GAAG,CAAC,eAAe,KAAK,QAAQ,IAAI,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE;YAC9E,CAAC,CAAC,EAAE,eAAe,EAAE,iBAAiB,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE;YACpE,CAAC,CAAC,EAAE,CAAC;KACR,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAY;IAClD,IAAI,MAAM,GAAG,GAAqB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAA;IACxE,MAAM,GAAG,GAAyB,EAAE,OAAO,EAAE,0BAA0B,CAAC,MAAM,EAAE,CAAC,EAAE,CAAA;IACnF,sBAAsB,CAAC,GAAG,EAAE,2BAA2B,EAAE,wBAAwB,EAAE;QACjF,KAAK,EAAE,sBAAsB;KAC9B,EAAE;QACD,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;YACrB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,EAAiC,CAAA;QACzD,CAAC;QACD,QAAQ,EAAE,GAAG,EAAE;YACb,GAAG,CAAC,OAAO,GAAG,0BAA0B,CAAC,MAAM,EAAE,CAAC,CAAA;QACpD,CAAC;KACF,CAAC,CAAA;IACF,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,qBAAqB,CAAC,SAA4B;IAChE,OAAO;QACL,GAAG,CAAC,SAAS,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC7E,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,GAAG,CAAC,SAAS,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,CAAC;KAC3G,CAAA;AACH,CAAC"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Read and refresh SuperGrok / xAI OAuth tokens from disk.
3
+ *
4
+ * dsh-ssh-tui does not depend on dsh-llm-xai-oauth. Keep this file's wire
5
+ * format identical to grok-bridge / that plugin: ~/.grok-bridge/auth.json
6
+ * with access_token, refresh_token, expires_at.
7
+ */
8
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
9
+ import { homedir } from 'node:os';
10
+ import { dirname, join } from 'node:path';
11
+ export const SUPERGROK_AUTH_PATHS = [
12
+ join(homedir(), '.grok-bridge', 'auth.json'),
13
+ join(homedir(), '.grok', 'auth.json'),
14
+ ];
15
+ export const SUPERGROK_REFRESH_SKEW_MS = 5 * 60 * 1000;
16
+ const DEFAULT_CLIENT_ID = 'b1a00492-073a-47ea-816f-4c329264a828';
17
+ const DEFAULT_TOKEN_URL = 'https://auth.x.ai/oauth2/token';
18
+ const DEFAULT_LIFETIME_SECONDS = 3600;
19
+ function stringField(record, key) {
20
+ const value = record[key];
21
+ return typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined;
22
+ }
23
+ function expiresAtMs(record) {
24
+ const raw = record.expires_at ?? record.expiresAt;
25
+ if (typeof raw === 'string')
26
+ return Date.parse(raw) || null;
27
+ if (typeof raw === 'number' && Number.isFinite(raw))
28
+ return raw < 1e12 ? raw * 1000 : raw;
29
+ return null;
30
+ }
31
+ export function parseSuperGrokAuthFile(raw, path) {
32
+ if (raw === null || typeof raw !== 'object' || Array.isArray(raw))
33
+ return undefined;
34
+ const record = raw;
35
+ const accessToken = stringField(record, 'access_token') ?? stringField(record, 'accessToken');
36
+ if (accessToken === undefined)
37
+ return undefined;
38
+ return {
39
+ accessToken,
40
+ refreshToken: stringField(record, 'refresh_token') ?? stringField(record, 'refreshToken') ?? null,
41
+ expiresAt: expiresAtMs(record),
42
+ clientId: stringField(record, 'oidc_client_id') ?? stringField(record, 'clientId') ?? null,
43
+ path,
44
+ };
45
+ }
46
+ export function superGrokTokenNeedsRefresh(token, now = Date.now(), skewMs = SUPERGROK_REFRESH_SKEW_MS) {
47
+ if (token.refreshToken === null)
48
+ return false;
49
+ if (token.expiresAt === null)
50
+ return false;
51
+ return token.expiresAt - now < skewMs;
52
+ }
53
+ async function readTokenFile(path) {
54
+ try {
55
+ return parseSuperGrokAuthFile(JSON.parse(await readFile(path, 'utf8')), path);
56
+ }
57
+ catch {
58
+ return undefined;
59
+ }
60
+ }
61
+ export async function loadSuperGrokToken(paths = SUPERGROK_AUTH_PATHS) {
62
+ for (const path of paths) {
63
+ const token = await readTokenFile(path);
64
+ if (token !== undefined)
65
+ return token;
66
+ }
67
+ return undefined;
68
+ }
69
+ async function postRefresh(refreshToken, clientId) {
70
+ const response = await fetch(DEFAULT_TOKEN_URL, {
71
+ method: 'POST',
72
+ headers: {
73
+ Accept: 'application/json',
74
+ 'Content-Type': 'application/x-www-form-urlencoded',
75
+ },
76
+ body: new URLSearchParams({
77
+ grant_type: 'refresh_token',
78
+ refresh_token: refreshToken,
79
+ client_id: clientId,
80
+ }),
81
+ signal: AbortSignal.timeout(15_000),
82
+ });
83
+ const body = await response.json();
84
+ const access = stringField(body, 'access_token');
85
+ if (!response.ok || access === undefined) {
86
+ const error = stringField(body, 'error');
87
+ const description = stringField(body, 'error_description');
88
+ throw new Error(`SuperGrok token 刷新失败(HTTP ${response.status})${error || description ? `:${[error, description].filter(Boolean).join(': ')}` : ''}`);
89
+ }
90
+ return {
91
+ access_token: access,
92
+ ...stringField(body, 'refresh_token') === undefined ? {} : { refresh_token: stringField(body, 'refresh_token') },
93
+ ...typeof body.expires_in === 'number' ? { expires_in: body.expires_in } : {},
94
+ };
95
+ }
96
+ export async function persistSuperGrokToken(path, tokenResponse, previousRefreshToken, now = Date.now()) {
97
+ const record = {
98
+ access_token: tokenResponse.access_token,
99
+ refresh_token: tokenResponse.refresh_token ?? previousRefreshToken,
100
+ expires_at: now + (tokenResponse.expires_in ?? DEFAULT_LIFETIME_SECONDS) * 1000,
101
+ saved_at: new Date(now).toISOString(),
102
+ };
103
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
104
+ await writeFile(path, `${JSON.stringify(record, null, 2)}\n`, { mode: 0o600 });
105
+ const stored = parseSuperGrokAuthFile(record, path);
106
+ if (stored === undefined)
107
+ throw new Error(`无法写入 SuperGrok token(${path})`);
108
+ return stored;
109
+ }
110
+ export async function resolveFreshSuperGrokToken(options = {}) {
111
+ const current = await loadSuperGrokToken(options.paths);
112
+ if (current === undefined)
113
+ return undefined;
114
+ const now = options.now ?? Date.now();
115
+ if (options.force !== true && !superGrokTokenNeedsRefresh(current, now)) {
116
+ return current.accessToken;
117
+ }
118
+ if (current.refreshToken === null) {
119
+ if (options.force === true || superGrokTokenNeedsRefresh({ ...current, refreshToken: 'x' }, now)) {
120
+ throw new Error(`SuperGrok token 没有 refresh_token,请运行 dsh-llm-xai-oauth login --force`);
121
+ }
122
+ return current.accessToken;
123
+ }
124
+ const next = await postRefresh(current.refreshToken, current.clientId ?? DEFAULT_CLIENT_ID);
125
+ const saved = await persistSuperGrokToken(current.path, next, current.refreshToken, now);
126
+ return saved.accessToken;
127
+ }
128
+ //# sourceMappingURL=supergrok-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supergrok-token.js","sourceRoot":"","sources":["../src/supergrok-token.ts"],"names":[],"mappings":"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"}