dsh-model-switch 0.4.25 → 0.4.27

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/CHANGELOG.md CHANGED
@@ -1,3 +1,28 @@
1
+ ## v0.4.27
2
+
3
+ A fix for a regression v0.4.26 introduced on DSH `0.2.1-rc.2`, plus the architecture change that removes its cause: the plugin no longer ships static copies of DSH's agent presets.
4
+
5
+ - **What broke (v0.4.26, DSH 0.2.1 only).** Every turn failed before the first token with `unknown prompt variable "{{cwd}}" in section "deployment:persona-suffix"`, and the composer needed the plugin disabled to continue. Cause: `cordis.patch.yml` replaced `preset-standard` / `preset-ptc` / `preset-cordis` wholesale with copies captured from the **0.2.0** presets. Those copies carried `suffix: Your working directory is {{cwd}}.` in the `persona` row; DSH 0.2.1 validates prompt variables and registers only `provider` and `model`, and its own presets dropped the `cwd` variable — so composing the persona suffix threw for every new turn. The copies had also drifted: they lacked the `time-context` and `tool-schedule` rows that 0.2.1 moved into presets, so even without the fatal error those rows would have been missing.
6
+ - **Fix: bridge the nested compaction engine at Host startup instead of copying presets (`src/preset-sync.ts`, wired from `ModelSwitchRuntime`).** On startup the Host finds each `@deepseek-ai/dsh-agent-preset` declaring row in the loader, walks its nested entry lists, disables the nested `@deepseek-ai/dsh-compaction-basic` row, and inserts `model-switch-compaction` directly after it. Every other row, prompt text, and `!!js` expression is left exactly as the installed DSH (or a deployment that edited the preset in the Web editor) wrote it. An entry that has not started yet gets its raw config swapped in place; a started entry is reloaded through the public loader `entry.update`. A failure is logged once and the official preset stays mounted, so the turn still runs and compaction simply keeps the official default route.
7
+ - **Why the copies are gone for good.** The static copies were a pinned snapshot that silently hid every later DSH preset change — this regression is exactly that failure mode. Reading each installed release's own preset definition removes the per-release re-sync step and restored the `time-context` / `tool-schedule` rows on 0.2.1.
8
+ - **Verification.** `pnpm run check` green (52 test files / 450 tests + pack gate). `tests/preset-patch.spec.ts` was rewritten to pin the bridge instead of the copies: 0.2.0-shaped (persona `{{cwd}}` suffix) and 0.2.1-shaped preset configs, idempotency, a preset without a compaction group, matching by package + preset id, both bridge paths (raw-config swap and loader reload), reload-failure logging, and a check that the patch no longer replaces any preset row. Lab plane on `0.2.1-rc.2` (`DSH_HOME=~/.dsh-lab`, port 3082): the composed tree now carries the official presets (`persona` prefix only, no `{{cwd}}`, with `time-context` and `tool-schedule` restored) and a headless host with 0.4.27 ran a full turn end to end — the answer streamed normally, and the naming record shows the new chain: a failed group candidate (`apigoto/no-such-title-model`) fell through to the deployment pair, `session/title-llm-request` recorded `apigoto/mimo-v2.6-flash` with `reasoningEffort: off` on the 0.2.1 call shape, and the provider title replaced the fallback title.
9
+ - **Residual.** The desktop app updated to `0.2.1-rc.2` is still running v0.4.26 with the plugin disabled; re-enable it after updating to 0.4.27 to confirm the live turn on that machine. 0.1.7 / 0.2.0 compositions are untouched by this change: with no preset row replacement, they keep their own shipped presets, and only the nested compaction swap is applied by the bridge at startup.
10
+
11
+ ## v0.4.26
12
+
13
+ Two coordinated changes: automatic session naming now survives a failing title route (the auxiliary call is retried and then falls through the candidate routes instead of leaving the deterministic fallback title in place forever), and official DSH `0.2.1-rc.2` is declared compatible — that release replaced the shared title call with a provider-prepared one and replaced the Subagent start surface with its activation API, so both seams are now handled per installed line.
14
+
15
+ - **Session naming: one failing route no longer owns the title (`src/session-title.ts`).** Evidence from the five sessions that showed a `session/title-llm-request` and no provider title: all five routed to `ark/ark-code-latest`, each fired 1–5 ms after the main request header on the same account, and each session's main loop carried that account's `RATE_LIMIT` (`RequestBurstTooFast` / `AccountQuotaExceeded`) or `TRANSPORT` failures — the auxiliary call has no retry and no fallback, so one rejected call left the deterministic fallback. The row now tries the resolved route first (session provider group's title pair → deployment-wide pair → the row's own pair → the session's logged route, deduplicated) and **only moves on after a failure**: a max-token failure gets one widened-budget retry on the same route (`min(4 × maxOutputTokens, 4096)`), other failures fall through to the next candidate, and when every candidate fails the row logs one warning naming the routes and rethrows, so the official fallback still applies. The configured route stays the first choice and nothing is persisted.
16
+ - **DSH 0.2.1 naming line (`executeSessionTitleLlm`).** `0.2.1-rc.2` removed `generateSessionTitleWithLlm` / `registerSessionTitleLlmProvider` and split the shared policy: the new `executeSessionTitleLlm(ctx, config, request, id, prepared)` returns assembled blocks plus the terminal finish reason, each provider owns its system instruction, input framing, reasoning-effort selection, and output interpretation, and `targetWords` / `targetCjkCharacters` moved into the provider's own config. The row detects the installed line at runtime and mirrors the shipped 0.2.1 provider exactly: same system instruction (including the best-effort line and, for all-prompts, the current-title stability rules anchored on a provider-sourced `currentTitle`), same JSON framing, the route's least supported reasoning effort, and the same finish-reason / whole-line-emphasis / empty-output acceptance rules. `cordis.patch.yml` also disables the `optional-session-title-all-prompts` row that 0.2.1's experimental session-titles bundle inserts (unknown-row warning on profiles without it, like the optional auto-review row).
17
+ - **DSH 0.2.1 compatibility review (0.2.0-rc.2 → 0.2.1-rc.2, public API only).**
18
+ - **Naming:** the service keeps `register` / `ensureFallback` / the `first-prompt` gate and only adds an optional `currentTitle` to the provider request; `onMainRequest` dropped one boundary-freshness condition. The provider request shape this row returns is unchanged.
19
+ - **Auto review:** the official gate now resolves the reviewing agent's directory through `ctx.workingDirectory.ensure(...)` and injects `workingDirectory`; `dsh-base` 0.2.1 mounts the `working-directory` row, so the official `apply` runs unchanged under this row's scoped `llm`.
20
+ - **Compaction and presets:** `dsh-compaction-basic` and `dsh-agent-preset` are byte-identical to 0.2.0, so the wholesale preset copies and the compaction engine need no re-sync.
21
+ - **Unchanged surfaces this plugin calls:** `llm.stream(GenerateOptions)` (with `prepareCall` added beside it), `web.registerSearchProvider`, `tools/pre-execute` (`exec.agent` kept), session `snapshotEvents` / `requestHeader` / `requestContext` / `append`, and the composer's `conversation.input.model` seat.
22
+ - **Subagents:** `@deepseek-ai/dsh-subagent` replaced `start()` / `startContinuable()` with `startActivation(spec)` plus a provider registry. The routed runtime therefore cannot override the new entry point; this row mounts the untouched official runtime (fail-closed) and logs one explicit notice. Recorded in `docs/seam-gap.md` for a later upstream proposal.
23
+ - **Verification.** `pnpm run check` green (`tsc` + `tsdown`, 52 test files / 437 tests, pack gate). New coverage: both auxiliary-LLM lines end to end, route-candidate ordering and dedup, max-token widening, fall-through, all-candidate failure reporting, cancelled requests staying silent, provider-prepared prompt/framing/anchor/effort selection, and the replaced-Subagent notice. Both official lines were also exercised end to end against the **real published packages** (0.2.1 `executeSessionTitleLlm`, 0.1.7 `generateSessionTitleWithLlm`): registration through the real policy validator, route selection, the `session/title-llm-request` record, the official system prompt, the least reasoning effort (0.2.1), and title acceptance all agree. **Lab plane:** `DSH_HOME=~/.dsh-lab` with the npm-installed `0.2.1-rc.2` runtime and the packed `dsh-model-switch-0.4.26.tgz` — profile composition `exit 0` with the naming, compaction, auto-review, and subagent rows composed from this plugin, and the Web Host booted on port 3082 serving the auth-gated page. **Residual (honest):** the 3082 capability RPC was not exercised from a browser (no browser automation is available in this environment), and the live desktop is still `0.2.0-rc.2`, so the 0.2.1 claim rests on the package-surface review, the unit suite, the real-package line checks, and the lab boot; the naming differential on a live 0.2.1 desktop is re-checked after the app update.
24
+ - **Post-release probe (2026-10-19 ~00:08 +0800, after the pinned Ark account's weekly quota reset).** The route was probed with the exact recorded system prompt and framed input. Before the reset it answered `HTTP 429 AccountQuotaExceeded`; with quota available the same route returns `finish: stop` and a complete title in 2.6–5.0 s with thinking enabled (57–134 reasoning tokens) versus 0.5–0.7 s and 6 tokens with thinking disabled. Tight budgets (`max_tokens` 8/16/24) still return a complete title, so truncation was not the observed failure mode — the route fall-through, not the widened retry, is the primary fix on this account. Evidence table and fix mapping in `docs/session-title-failure-mode.md`.
25
+
1
26
  ## v0.4.25
2
27
 
3
28
  Three coordinated changes: Provider groups now cover all four per-session capabilities (compaction, auto review, session naming, and subagents) with mid-session provider-switch following; capability switches stay disabled until the model catalog has loaded (and while any row save is in flight) so clicks are never silently dropped; and send-time switch compaction (`compactOnSwitch` / `src/switch-compact.ts`) has been removed completely.
package/PRODUCT.md CHANGED
@@ -13,9 +13,9 @@
13
13
  - **Plan Review:** intercepts the official `plan-review` composer takeover with a header execution-model picker and right-aligned Discuss in chat / Reject / Set as goal and run / Confirm actions. Confirm commits the selected model before answering; a refused commit leaves the review pending and retryable. Reject carries optional human feedback as the answer's own `custom` text, which plan mode reports to the model. **Set as goal and run** arms this Plan as the session's goal through the released `remote.goals.create` — replacing an unfinished goal with `get` + `clear` first so the new Plan receives a fresh round cap — and only then answers, so `dsh-goal-round-driver` carries the Plan after plan mode exits. The goal is set before the answer, a refusal keeps the review pending and retryable, and a deployment that mounts no goal service disables the action with an explicit reason; the plugin stores no goal state, schedules no rounds, and owns no part of the goal domain. The card body carries only the official two-part summary (first line, first paragraph); the full plan opens in the right sidebar through ui-plan's registered preview opener, which this card drives because a composer-takeover entry cannot declare the official actions slot. Discuss in chat withdraws the takeover through the Host's own verb — `dismiss()` where the Host publishes it, `cancel()` on the older generation — and names the Host when neither seam exists, so a settled review is never a dead end. The same runtime reservation applies.
14
14
  - **Auto review:** the reviewer model for the official `@deepseek-ai/dsh-experimental-auto-review` per-call gate, off by default — both fields empty means reviews follow the session's own model. On pins a deployment-wide provider/model, and each review resolves its route per session: the session's provider group's reviewer pair → the flat card pair → the session's own model. Session correlation rides an outer `{ prepend: true }` `tools/pre-execute` listener on the review scope (`exec.agent.session`), so parallel sessions on different providers never interfere and mid-session provider switches take effect on the very next review.
15
15
  - **Compaction:** the summarization model behind `/compact` and DSH's automatic compaction, off by default — both fields empty means compaction follows the conversation target model. On pins a deployment-wide provider/model, and each summarization call resolves its route per session: the session's provider group's compaction pair → the flat card pair → the official row's `modelPolicies` / conversation-target default. When a per-session route applies, the child context's `llm` wrapper updates `options.provider`/`options.model` in place on `purpose === 'compaction'` calls so `summarizeWithLlm` returns and durably records the exact route that wrote the summary in `compaction/summary`.
16
- - **Session naming:** the model behind DSH's automatic session titles, off by default — both fields empty means naming follows the session's own model, which is the official behavior. On pins a deployment-wide provider/model that each session re-resolves per request: provider group → flat pair → the session's own model. The route is read through on every naming request, so a save applies to the very next request with no restart and never interrupts an in-flight request; the exact pair used is recorded in the session's own `session/title-llm-request` event by the official naming implementation, so the record and the request always agree. The plugin replaces the official `session-title-llm` row (one registered naming provider per context) and mirrors the cadence that row declared; naming cadence and title policy remain DSH's.
16
+ - **Session naming:** the model behind DSH's automatic session titles, off by default — both fields empty means naming follows the session's own model, which is the official behavior. On pins a deployment-wide provider/model that each session re-resolves per request: provider group → flat pair → the session's own model. The route is read through on every naming request, so a save applies to the very next request with no restart and never interrupts an in-flight request; the exact pair used is recorded in the session's own `session/title-llm-request` event by the official naming implementation, so the record and the request always agree. The first candidate is used unless its call fails: a max-token failure gets one widened output-budget retry on the same route, any other failure falls through to the next candidate (provider group → flat pair → the row's own pair → the session's own model), and only when every candidate fails does naming keep DSH's deterministic fallback title, after one warning that names the routes tried. A fallback neither writes settings nor changes the stored route. The plugin replaces the official `session-title-llm` row (one registered naming provider per context), mirrors the cadence that row declared, and follows whichever official auxiliary title call the installed DSH line publishes; naming cadence and title policy remain DSH's.
17
17
 
18
- Model choices are capability-driven. Invalid, unavailable, or unsupported selections remain visible to configuration surfaces and fail loudly at use; routing never silently falls back.
18
+ Model choices are capability-driven. Invalid, unavailable, or unsupported selections remain visible to configuration surfaces and fail loudly at use; routing never silently falls back. The one exception is the session-naming per-call route fallback above: it engages only after the pinned route's call failed, is reported once when every candidate fails, and never changes the stored route.
19
19
 
20
20
  ## Preset modes
21
21
 
@@ -27,7 +27,7 @@ The settings surface aggregates public Settings namespaces, reads and mutates wi
27
27
 
28
28
  ## Exclusions
29
29
 
30
- Send-time switch compaction (`compactOnSwitch`) was removed in 0.4.25: injecting plugin-authored compaction checkpoints and notices during model switches interacted with the official `compaction-basic` step-pressure loop when a session's working set stayed near the target window's pressure threshold. All compaction policy and triggers belong exclusively to DSH's official compaction engine (`/compact` and automatic pressure/overflow compaction). The Auto reviewer route override rides a name-matched replacement of the experimental auto-review row and changes only the review request's provider/model. The compaction summarization route override rides a name-matched replacement of the official compaction-basic engine and changes only the summarization request's provider/model, forwarding the row's own engine config unchanged. Because the Web surface runs session compaction inside each agent preset's isolated compaction group and profile patches cannot address rows inside a preset's plugins list, the plugin replaces the shipped preset rows wholesale (the Web preset editor's own save mechanism) to swap that group's engine; the copies are re-synced per DSH release during the existing compatibility verification, and a deployment that edits presets in the Web editor owns the merge from its own wholesale row. Model Switch does not own global compaction policy, titles, fetch routing, fallback, load balancing, provider credentials, CLI/API, config migration, or DSH Core modifications.
30
+ Send-time switch compaction (`compactOnSwitch`) was removed in 0.4.25: injecting plugin-authored compaction checkpoints and notices during model switches interacted with the official `compaction-basic` step-pressure loop when a session's working set stayed near the target window's pressure threshold. All compaction policy and triggers belong exclusively to DSH's official compaction engine (`/compact` and automatic pressure/overflow compaction). The Auto reviewer route override rides a name-matched replacement of the experimental auto-review row and changes only the review request's provider/model. The compaction summarization route override rides a name-matched replacement of the official compaction-basic engine and changes only the summarization request's provider/model, forwarding the row's own engine config unchanged. Because the Web surface runs session compaction inside each agent preset's isolated compaction group and profile patches cannot address rows inside a preset's plugins list, the Host bridges that nested row at startup (`src/preset-sync.ts`): it disables the group's official `compaction-basic` and inserts `model-switch-compaction` directly after it, leaving every other row exactly as the installed DSH (or a deployment's own Web-editor save) wrote it. The plugin ships no preset copies: a DSH preset change needs no re-sync, and a deployment's preset edits are preserved. Model Switch does not own global compaction policy, titles, fetch routing, fallback, load balancing, provider credentials, CLI/API, config migration, or DSH Core modifications.
31
31
 
32
32
  Official `settings.section` has no icon field. The Settings nav glyph is a label-matched DOM swap, the same published pattern as usage-monitor, until an official icon seam exists. The Plan Review takeover uses priority -5, and the composer model seat uses priority -10.
33
33
 
package/README.md CHANGED
@@ -111,7 +111,7 @@ Each summarization call (`options.purpose === 'compaction'`) also resolves its r
111
111
  summarizationModel: deepseek-reasoner
112
112
  ```
113
113
 
114
- How the route reaches the engine depends on where the deployment runs its agent plane. The Web surface moves compaction into each agent preset's isolated `compaction` group, and profile patches cannot address rows inside a preset's `plugins` list — so this plugin replaces each shipped preset row wholesale (the same id-targeted mechanism the Web preset editor saves with) and swaps that group's official `compaction-basic` for `model-switch-compaction`, which mounts the **same official `BasicCompactionEngine`** under `compactionScope`. Surfaces that compose the agent process-wide (the TUI) use the top-level row replacement instead. Two consequences: a DSH release that edits those presets needs the copies re-synced (this plugin's per-release verification covers it), and a deployment that edits presets in the Web editor writes its own wholesale row that then owns the merge.
114
+ How the route reaches the engine depends on where the deployment runs its agent plane. The Web surface moves compaction into each agent preset's isolated `compaction` group, and profile patches cannot address rows inside a preset's `plugins` list — so the Host bridges that nested row at startup (`src/preset-sync.ts`): it disables the group's official `compaction-basic` and inserts `model-switch-compaction` directly after it, which mounts the **same official `BasicCompactionEngine`** under `compactionScope`. Every other preset row is left exactly as the installed DSH (or a deployment's own Web-editor save) wrote it; the plugin ships no preset copies, so a DSH preset change needs no re-sync and a deployment's preset edits are preserved. Surfaces that compose the agent process-wide (the TUI) use the top-level row replacement instead.
115
115
 
116
116
  Known issue (upstream; recorded in `docs/seam-gap.md`): while the working set stays above the official engine's pressure threshold, automatic compaction can fire on every step and keep re-attempting ranges whose summaries fail the engine's own "summary must be smaller" guard — a visible loop of automatic compactions that this plugin does not control (verified in a session A/B with the plugin enabled and disabled). Mitigations on the forwarded row config: `auto: false` (keeps `/compact`), a higher `thresholdRatio`, a smaller mounted tool schema, or a pinned compaction model whose summaries are leaner.
117
117
 
@@ -148,10 +148,10 @@ dsh plugin --profile web add --force dsh-model-switch
148
148
  A packed tarball installs the same build without a registry:
149
149
 
150
150
  ```sh
151
- dsh plugin --profile web add --force ./dsh-model-switch-0.4.17.tgz
151
+ dsh plugin --profile web add --force ./dsh-model-switch-0.4.26.tgz
152
152
  ```
153
153
 
154
- Then install only the provider adapters you use. This release was checked against official DeepSeek Harness `0.1.7-rc.2` and verified on `0.2.0-rc.2`:
154
+ Then install only the provider adapters you use. This release was checked against official DeepSeek Harness `0.1.7-rc.2` and verified on `0.2.0-rc.2` and `0.2.1-rc.2`:
155
155
 
156
156
  ```sh
157
157
  dsh plugin --profile web add --force \
package/README.zh.md CHANGED
@@ -109,7 +109,7 @@ Plan Review 拥有独立于会话当前路由的执行模型草稿。**确认执
109
109
  summarizationModel: deepseek-reasoner
110
110
  ```
111
111
 
112
- 路由如何到达压缩引擎取决于部署在哪一层组合 agent。Web 面把压缩放进每个 Agent 预设的隔离 `compaction` 组里,而 profile patch 无法寻址 preset `plugins` 列表内部的行——因此本插件整表替换各预设行(与 Web 预设编辑器保存修改用的是同一套 id 定位机制),把该组的官方 `compaction-basic` 换成 `model-switch-compaction`,由它在 `compactionScope` 下挂载**同一份官方 `BasicCompactionEngine`**。进程级组合 agent 的面(如 TUI)则走顶层行替换。两个后果:DSH 发布若改动这些预设,随包副本需要同步(本插件的逐版本核对覆盖这一步);部署若用 Web 编辑器改预设,会写出自己的整表行、并从那之后自行负责合并。
112
+ 路由如何到达压缩引擎取决于部署在哪一层组合 agent。Web 面把压缩放进每个 Agent 预设的隔离 `compaction` 组里,而 profile patch 无法寻址 preset `plugins` 列表内部的行——因此 Host 在启动时桥接那一行(`src/preset-sync.ts`):禁用该组的官方 `compaction-basic`,并在其后插入 `model-switch-compaction`,由它在 `compactionScope` 下挂载**同一份官方 `BasicCompactionEngine`**。其余预设行一律保持安装版 DSH(或部署在 Web 编辑器里保存的版本)的原样;插件不再随包携带预设副本,所以 DSH 改预设无需再同步副本,部署自己的预设修改也不会被覆盖。进程级组合 agent 的面(如 TUI)则走顶层行替换。
113
113
 
114
114
  已知问题(上游侧,见 `docs/seam-gap.md`):当工作集持续超过官方引擎的压力阈值时,自动压缩可能每步触发,并反复重试摘要过不了官方「摘要必须更小」守卫的小片段——表现为"不停自动压缩",本插件不控制该行为(已在同一会话做过插件开/关 A/B 对照)。可用的缓解(都在转发行配置上):`auto: false`(保留 `/compact`)、调高 `thresholdRatio`、减少挂载的工具 schema,或固定一个摘要更精炼的压缩模型。
115
115
 
@@ -180,7 +180,7 @@ DeepSeek 薄适配器调用官方公开 `DeepSeekSearchProvider`,复用用户
180
180
 
181
181
  DSH Host peer 和开发依赖接受 `>=0.1.7-alpha.2`,包括 rc.1 和后续版本。开发锁文件解析到 rc.2。Cordis 接受 `>=4.0.4 <5.0.0`。
182
182
 
183
- 已验证版本:`0.1.7-alpha.2`、`0.1.7-rc.1`、`0.1.7-rc.2`、`0.2.0-rc.2`。0.2.0 的声明覆盖三处差异:Host 改名的提问撤下动词(`cancel()` → `dismiss()`)、`session.selectModel` 不 await 的部署默认值写入、以返回值报出的 `ModelDirectory.select` 拒绝;三者均已在 lab(3082/3085)与真实桌面会话中逐一验证。
183
+ 已验证版本:`0.1.7-alpha.2`、`0.1.7-rc.1`、`0.1.7-rc.2`、`0.2.0-rc.2`、`0.2.1-rc.2`。0.2.0 的声明覆盖三处差异:Host 改名的提问撤下动词(`cancel()` → `dismiss()`)、`session.selectModel` 不 await 的部署默认值写入、以返回值报出的 `ModelDirectory.select` 拒绝;三者均已在 lab(3082/3085)与真实桌面会话中逐一验证。0.2.1 的声明覆盖两处被替换的 seam:共享命名调用改为 provider 自备提示词与解析的 `executeSessionTitleLlm`(本插件按安装行在运行时适配,并镜像官方 0.2.1 的提示词、取最低 reasoning effort 与 `currentTitle` 锚定);Subagent 运行时以 `startActivation` 取代 `start()`/`startContinuable()`,路由版运行时在新 Host 上不可用,本插件改为挂载未经改动的官方运行时并输出一条明确提示(记录于 `docs/seam-gap.md`)。0.2.1 的 lab 证据为:npm 安装的 0.2.1 运行时 + 打包后的 0.4.26 组合 `exit 0`、命名/压缩/自动审查/子代理四行均来自本插件、Web Host 在 3082 启动并服务需要鉴权的页面;该次未经浏览器调用 3082 能力 RPC,真实桌面的 0.2.1 命名差分在应用升级后复验。0.2.1 还暴露出一处预设层面的差异(0.2.1 校验提示词变量、只有 `provider`/`model`,且把 `time-context`/`tool-schedule` 移进预设):0.4.26 的静态预设副本因此让每一轮都报 `unknown prompt variable "{{cwd}}"`,0.4.27 删除副本改为启动期运行时桥接,并在 lab 的 0.2.1 headless 真实回合中验证通过(展开见 CHANGELOG 0.4.27)。
184
184
 
185
185
  `package.json#dsh.compatibility.dshReleases` 中的已验证版本是证据,不是允许列表。新增验证声明前要审查公开 API 变化并测试新 Host 版本。
186
186
 
package/cordis.patch.yml CHANGED
@@ -34,479 +34,25 @@
34
34
  name: '@deepseek-ai/dsh-session-title-first-prompt-llm'
35
35
  disabled: true
36
36
 
37
- # The Web surface moves the agent plane (tools, compaction, delegation) into
38
- # per-session agent presets: session /compact and official automatic compaction
39
- # run against the compaction service inside each preset's isolated `compaction`
40
- # group, not the top-level row disabled above. The Loader's patch index cannot
41
- # address rows inside a preset's `config.plugins` list, so Model Switch replaces
42
- # each preset row wholesale — the same id-targeted mechanism the Web preset
43
- # editor saves with — and swaps that group's official compaction-basic for
44
- # model-switch-compaction. The copies come from
45
- # @deepseek-ai/dsh-web-app/presets/*.patch.yml (minimal has no compaction
46
- # group); a DSH release that edits those presets needs the copies re-synced as
47
- # part of the per-release verification, and a deployment that edits presets in
48
- # the Web editor writes its own wholesale row that owns the merge from there.
49
- # standard: agent-preset row replaced wholesale so its compaction group runs
50
- # model-switch-compaction (configurable summarization route) instead of the
51
- # official compaction-basic. Source: @deepseek-ai/dsh-web-app/presets/standard.patch.yml.
52
- - id: preset-standard
53
- name: '@deepseek-ai/dsh-agent-preset'
54
- config:
55
- id: standard
56
- order: 1
57
- plugins:
58
- - id: persona
59
- name: '@deepseek-ai/dsh-persona'
60
- config:
61
- suffix: Your working directory is {{cwd}}.
62
- prefix: You are a coding agent powered by the {{model}} model.
63
- - id: agent-instructions
64
- name: '@deepseek-ai/dsh-agent-instructions'
65
- config:
66
- maxBytes: 65536
67
- - id: tool-bash
68
- name: '@deepseek-ai/dsh-tool-bash'
69
- disabled: !!js process.platform === 'win32'
70
- - id: tool-pwsh
71
- name: '@deepseek-ai/dsh-tool-pwsh'
72
- disabled: !!js process.platform !== 'win32'
73
- - id: tool-fs
74
- name: '@deepseek-ai/dsh-tool-fs'
75
- - id: tool-fs-search
76
- name: '@deepseek-ai/dsh-tool-fs-search'
77
- config:
78
- sampleOverCapGlobResults: false
79
- - id: tool-jobs
80
- name: '@deepseek-ai/dsh-tool-jobs'
81
- - id: skill-filesystem
82
- name: '@deepseek-ai/dsh-skill-filesystem'
83
- - id: tool-skill
84
- name: '@deepseek-ai/dsh-tool-skill'
85
- - id: command-goal
86
- name: '@deepseek-ai/dsh-command-goal'
87
- - id: tool-goal
88
- name: '@deepseek-ai/dsh-tool-goal'
89
- - id: planning
90
- name: cordis:group
91
- group: true
92
- isolate:
93
- planMode: true
94
- config:
95
- - id: plan-mode
96
- name: '@deepseek-ai/dsh-plan-mode'
97
- config:
98
- section: |
99
- You are in plan mode. Stay in plan mode until exit_plan_mode succeeds or the user switches the session mode. Imperative language to implement changes means plan the implementation, not execute it. A user's conversational agreement 鈥?including an answer confirming something you asked 鈥?approves nothing and does not end plan mode; fold the confirmed decision into the plan and submit it through exit_plan_mode.
100
-
101
- Explore first. Use non-mutating reads, searches, static analysis, and checks to ground the plan in the actual repository. Do not edit or write files, change configuration, run formatters or code generation that rewrites tracked files, commit, or otherwise carry out the plan. Prefer existing functions and patterns over new machinery.
102
-
103
- The tool catalog stays the same across modes for request-cache stability. These plan-mode rules override any later tool description or guidance that suggests using mutation tools; those tools remain listed to keep the tool catalog unchanged. Do not use todo_write to track this planning phase: it tracks implementation after an approved plan, while the plan itself belongs in exit_plan_mode.
104
-
105
- Resolve discoverable facts by inspection. Use ask_user_question only for user-owned choices or material ambiguity that inspection cannot answer. Do not ask the user where code lives or how current behavior works when you can find out.
106
-
107
- Make the plan decision-complete: state the goal and success criteria; group implementation changes by subsystem; identify public API, schema, and data-flow changes; cover edge cases, failure modes, tests, acceptance criteria, and explicit assumptions. Keep it concise enough to review but detailed enough that another engineer can implement it without making design decisions.
108
-
109
- When ready, call exit_plan_mode with the complete plan markdown, starting with a # title. Make exit_plan_mode the only and final tool call in that assistant response: it presents the plan for approval, and implementation begins only in a later step after approval. Do not paste the final plan as a plain reply or ask "should I proceed?" through prose or ask_user_question. If review rejects it, incorporate the feedback and present again. If the review channel is unavailable or aborted, stay in plan mode and ask the user to switch modes manually; do not proceed with implementation.
110
- - id: compaction
111
- name: cordis:group
112
- group: true
113
- isolate:
114
- compaction: true
115
- toolResultPruner: true
116
- config:
117
- - id: compaction-basic
118
- name: '@deepseek-ai/dsh-compaction-basic'
119
- disabled: true
120
- - id: model-switch-compaction
121
- name: 'dsh-model-switch/compaction'
122
- - id: command-compact
123
- name: '@deepseek-ai/dsh-command-compact'
124
- - id: tool-result-pruner
125
- name: '@deepseek-ai/dsh-compaction-tool-result-pruner'
126
- config:
127
- thresholdChars: 8192
128
- headChars: 4096
129
- tailChars: 1024
130
- - id: delegation
131
- name: cordis:group
132
- group: true
133
- isolate:
134
- workflowEngine: true
135
- config:
136
- - id: tool-subagent-control
137
- name: '@deepseek-ai/dsh-tool-subagent-control'
138
- - id: tool-subagent-list-agents
139
- name: '@deepseek-ai/dsh-tool-subagent-control/list-agents'
140
- - id: tool-subagent
141
- name: '@deepseek-ai/dsh-tool-subagent'
142
- config:
143
- provider: spawn
144
- toolName: subagent
145
- modelSelectionSettings: true
146
- backgroundMode: continuable
147
- - id: tool-subagent-fork
148
- name: '@deepseek-ai/dsh-tool-subagent'
149
- config:
150
- provider: fork
151
- toolName: subagent_fork
152
- backgroundMode: continuable
153
- - id: tool-subagent-codex
154
- name: '@deepseek-ai/dsh-tool-subagent'
155
- disabled: true
156
- config:
157
- provider: codex
158
- toolName: subagent_codex
159
- backgroundMode: one-shot
160
- maxDepth: provider-managed
161
- - id: tool-subagent-claude-code
162
- name: '@deepseek-ai/dsh-tool-subagent'
163
- disabled: true
164
- config:
165
- provider: claude-code
166
- toolName: subagent_claude_code
167
- backgroundMode: one-shot
168
- maxDepth: provider-managed
169
- - id: workflow-ptc
170
- name: '@deepseek-ai/dsh-workflow-ptc'
171
- config:
172
- provider: spawn
173
- - id: tool-workflow
174
- name: '@deepseek-ai/dsh-tool-workflow'
175
- - id: tool-ralph
176
- name: '@deepseek-ai/dsh-tool-ralph'
177
- disabled: true
178
- config:
179
- subagentProvider: spawn
180
- maxRounds: 64
181
- - id: tool-ask-user
182
- name: '@deepseek-ai/dsh-tool-ask-user'
183
- - id: tool-todo
184
- name: '@deepseek-ai/dsh-tool-todo'
185
- config:
186
- allowParallelInProgress: true
187
- - id: tool-web
188
- name: '@deepseek-ai/dsh-tool-web'
189
- config:
190
- fetch: true
191
- searchTimeoutMs: 60000
192
- - id: present
193
- name: '@deepseek-ai/dsh-tool-present'
194
- - id: tool-plugin-manager
195
- name: '@deepseek-ai/dsh-plugin-manager/tools'
196
- disabled: true
197
-
198
- # ptc: agent-preset row replaced wholesale so its compaction group runs
199
- # model-switch-compaction (configurable summarization route) instead of the
200
- # official compaction-basic. Source: @deepseek-ai/dsh-web-app/presets/ptc.patch.yml.
201
- - id: preset-ptc
202
- name: '@deepseek-ai/dsh-agent-preset'
203
- config:
204
- id: ptc
205
- order: 2
206
- plugins:
207
- - id: persona
208
- name: '@deepseek-ai/dsh-persona'
209
- config:
210
- suffix: Your working directory is {{cwd}}.
211
- prefix: You are a coding agent powered by the {{model}} model.
212
- - id: agent-instructions
213
- name: '@deepseek-ai/dsh-agent-instructions'
214
- config:
215
- maxBytes: 65536
216
- - id: tool-bash
217
- name: '@deepseek-ai/dsh-tool-bash'
218
- disabled: !!js process.platform === 'win32'
219
- - id: tool-pwsh
220
- name: '@deepseek-ai/dsh-tool-pwsh'
221
- disabled: !!js process.platform !== 'win32'
222
- - id: tool-fs
223
- name: '@deepseek-ai/dsh-tool-fs'
224
- - id: tool-fs-search
225
- name: '@deepseek-ai/dsh-tool-fs-search'
226
- config:
227
- sampleOverCapGlobResults: false
228
- - id: tool-jobs
229
- name: '@deepseek-ai/dsh-tool-jobs'
230
- - id: skill-filesystem
231
- name: '@deepseek-ai/dsh-skill-filesystem'
232
- - id: tool-skill
233
- name: '@deepseek-ai/dsh-tool-skill'
234
- - id: command-goal
235
- name: '@deepseek-ai/dsh-command-goal'
236
- - id: tool-goal
237
- name: '@deepseek-ai/dsh-tool-goal'
238
- - id: planning
239
- name: cordis:group
240
- group: true
241
- isolate:
242
- planMode: true
243
- config:
244
- - id: plan-mode
245
- name: '@deepseek-ai/dsh-plan-mode'
246
- config:
247
- section: |
248
- You are in plan mode. Stay in plan mode until exit_plan_mode succeeds or the user switches the session mode. Imperative language to implement changes means plan the implementation, not execute it. A user's conversational agreement 鈥?including an answer confirming something you asked 鈥?approves nothing and does not end plan mode; fold the confirmed decision into the plan and submit it through exit_plan_mode.
249
-
250
- Explore first. Use non-mutating reads, searches, static analysis, and checks to ground the plan in the actual repository. Do not edit or write files, change configuration, run formatters or code generation that rewrites tracked files, commit, or otherwise carry out the plan. Prefer existing functions and patterns over new machinery.
251
-
252
- The tool catalog stays the same across modes for request-cache stability. These plan-mode rules override any later tool description or guidance that suggests using mutation tools; those tools remain listed to keep the tool catalog unchanged. Do not use todo_write to track this planning phase: it tracks implementation after an approved plan, while the plan itself belongs in exit_plan_mode.
253
-
254
- Resolve discoverable facts by inspection. Use ask_user_question only for user-owned choices or material ambiguity that inspection cannot answer. Do not ask the user where code lives or how current behavior works when you can find out.
255
-
256
- Make the plan decision-complete: state the goal and success criteria; group implementation changes by subsystem; identify public API, schema, and data-flow changes; cover edge cases, failure modes, tests, acceptance criteria, and explicit assumptions. Keep it concise enough to review but detailed enough that another engineer can implement it without making design decisions.
257
-
258
- When ready, call exit_plan_mode with the complete plan markdown, starting with a # title. Make exit_plan_mode the only and final tool call in that assistant response: it presents the plan for approval, and implementation begins only in a later step after approval. Do not paste the final plan as a plain reply or ask "should I proceed?" through prose or ask_user_question. If review rejects it, incorporate the feedback and present again. If the review channel is unavailable or aborted, stay in plan mode and ask the user to switch modes manually; do not proceed with implementation.
259
- - id: compaction
260
- name: cordis:group
261
- group: true
262
- isolate:
263
- compaction: true
264
- toolResultPruner: true
265
- config:
266
- - id: compaction-basic
267
- name: '@deepseek-ai/dsh-compaction-basic'
268
- disabled: true
269
- - id: model-switch-compaction
270
- name: 'dsh-model-switch/compaction'
271
- - id: command-compact
272
- name: '@deepseek-ai/dsh-command-compact'
273
- - id: tool-result-pruner
274
- name: '@deepseek-ai/dsh-compaction-tool-result-pruner'
275
- config:
276
- thresholdChars: 8192
277
- headChars: 4096
278
- tailChars: 1024
279
- - id: delegation
280
- name: cordis:group
281
- group: true
282
- isolate:
283
- workflowEngine: true
284
- config:
285
- - id: tool-subagent-control
286
- name: '@deepseek-ai/dsh-tool-subagent-control'
287
- - id: tool-subagent-list-agents
288
- name: '@deepseek-ai/dsh-tool-subagent-control/list-agents'
289
- - id: tool-subagent
290
- name: '@deepseek-ai/dsh-tool-subagent'
291
- config:
292
- provider: spawn
293
- toolName: subagent
294
- modelSelectionSettings: true
295
- backgroundMode: continuable
296
- - id: tool-subagent-fork
297
- name: '@deepseek-ai/dsh-tool-subagent'
298
- config:
299
- provider: fork
300
- toolName: subagent_fork
301
- backgroundMode: continuable
302
- - id: tool-subagent-codex
303
- name: '@deepseek-ai/dsh-tool-subagent'
304
- disabled: true
305
- config:
306
- provider: codex
307
- toolName: subagent_codex
308
- backgroundMode: one-shot
309
- maxDepth: provider-managed
310
- - id: tool-subagent-claude-code
311
- name: '@deepseek-ai/dsh-tool-subagent'
312
- disabled: true
313
- config:
314
- provider: claude-code
315
- toolName: subagent_claude_code
316
- backgroundMode: one-shot
317
- maxDepth: provider-managed
318
- - id: workflow-ptc
319
- name: '@deepseek-ai/dsh-workflow-ptc'
320
- disabled: true
321
- config:
322
- provider: spawn
323
- - id: tool-workflow
324
- name: '@deepseek-ai/dsh-tool-workflow'
325
- disabled: true
326
- - id: tool-ralph
327
- name: '@deepseek-ai/dsh-tool-ralph'
328
- disabled: true
329
- config:
330
- subagentProvider: spawn
331
- maxRounds: 64
332
- - id: tool-ask-user
333
- name: '@deepseek-ai/dsh-tool-ask-user'
334
- - id: tool-todo
335
- name: '@deepseek-ai/dsh-tool-todo'
336
- config:
337
- allowParallelInProgress: true
338
- - id: tool-web
339
- name: '@deepseek-ai/dsh-tool-web'
340
- config:
341
- fetch: true
342
- searchTimeoutMs: 60000
343
- - id: tool-presentation
344
- name: '@deepseek-ai/dsh-agent-tool-presentation'
345
- config:
346
- mode: ptc
347
- - id: present
348
- name: '@deepseek-ai/dsh-tool-present'
349
- - id: tool-plugin-manager
350
- name: '@deepseek-ai/dsh-plugin-manager/tools'
351
- disabled: true
352
-
353
- # cordis: agent-preset row replaced wholesale so its compaction group runs
354
- # model-switch-compaction (configurable summarization route) instead of the
355
- # official compaction-basic. Source: @deepseek-ai/dsh-web-app/presets/cordis.patch.yml.
356
- - id: preset-cordis
357
- name: '@deepseek-ai/dsh-agent-preset'
358
- config:
359
- id: cordis
360
- order: 4
361
- plugins:
362
- # Same persona as `standard`: tool descriptions and the skill catalog carry
363
- # the operating detail, and the skills own the preset-authoring rules.
364
- - id: persona
365
- name: '@deepseek-ai/dsh-persona'
366
- config:
367
- suffix: Your working directory is {{cwd}}.
368
- prefix: >-
369
- You are a coding agent powered by the {{model}} model.
370
- - id: agent-instructions
371
- name: '@deepseek-ai/dsh-agent-instructions'
372
- config:
373
- maxBytes: 65536
374
- - id: tool-bash
375
- name: '@deepseek-ai/dsh-tool-bash'
376
- disabled: !!js process.platform === 'win32'
377
- - id: tool-pwsh
378
- name: '@deepseek-ai/dsh-tool-pwsh'
379
- disabled: !!js process.platform !== 'win32'
380
- - id: tool-fs
381
- name: '@deepseek-ai/dsh-tool-fs'
382
- - id: tool-fs-search
383
- name: '@deepseek-ai/dsh-tool-fs-search'
384
- config:
385
- sampleOverCapGlobResults: false
386
- - id: tool-jobs
387
- name: '@deepseek-ai/dsh-tool-jobs'
388
- - id: command-goal
389
- name: '@deepseek-ai/dsh-command-goal'
390
- - id: tool-goal
391
- name: '@deepseek-ai/dsh-tool-goal'
392
- - id: planning
393
- name: cordis:group
394
- group: true
395
- isolate:
396
- planMode: true
397
- config:
398
- - id: plan-mode
399
- name: '@deepseek-ai/dsh-plan-mode'
400
- config:
401
- section: |
402
- You are in plan mode. Stay in plan mode until exit_plan_mode succeeds or the user switches the session mode. Imperative language to implement changes means plan the implementation, not execute it. A user's conversational agreement 鈥?including an answer confirming something you asked 鈥?approves nothing and does not end plan mode; fold the confirmed decision into the plan and submit it through exit_plan_mode.
403
-
404
- Explore first. Use non-mutating reads, searches, static analysis, and checks to ground the plan in the actual repository. Do not edit or write files, change configuration, run formatters or code generation that rewrites tracked files, commit, or otherwise carry out the plan. Prefer existing functions and patterns over new machinery.
405
-
406
- The tool catalog stays the same across modes for request-cache stability. These plan-mode rules override any later tool description or guidance that suggests using mutation tools; those tools remain listed to keep the tool catalog unchanged. Do not use todo_write to track this planning phase: it tracks implementation after an approved plan, while the plan itself belongs in exit_plan_mode.
407
-
408
- Resolve discoverable facts by inspection. Use ask_user_question only for user-owned choices or material ambiguity that inspection cannot answer. Do not ask the user where code lives or how current behavior works when you can find out.
409
-
410
- Make the plan decision-complete: state the goal and success criteria; group implementation changes by subsystem; identify public API, schema, and data-flow changes; cover edge cases, failure modes, tests, acceptance criteria, and explicit assumptions. Keep it concise enough to review but detailed enough that another engineer can implement it without making design decisions.
411
-
412
- When ready, call exit_plan_mode with the complete plan markdown, starting with a # title. Make exit_plan_mode the only and final tool call in that assistant response: it presents the plan for approval, and implementation begins only in a later step after approval. Do not paste the final plan as a plain reply or ask "should I proceed?" through prose or ask_user_question. If review rejects it, incorporate the feedback and present again. If the review channel is unavailable or aborted, stay in plan mode and ask the user to switch modes manually; do not proceed with implementation.
413
- - id: compaction
414
- name: cordis:group
415
- group: true
416
- isolate:
417
- compaction: true
418
- toolResultPruner: true
419
- config:
420
- - id: compaction-basic
421
- name: '@deepseek-ai/dsh-compaction-basic'
422
- disabled: true
423
- - id: model-switch-compaction
424
- name: 'dsh-model-switch/compaction'
425
- - id: command-compact
426
- name: '@deepseek-ai/dsh-command-compact'
427
- - id: tool-result-pruner
428
- name: '@deepseek-ai/dsh-compaction-tool-result-pruner'
429
- config:
430
- thresholdChars: 8192
431
- headChars: 4096
432
- tailChars: 1024
433
- - id: delegation
434
- name: cordis:group
435
- group: true
436
- isolate:
437
- workflowEngine: true
438
- config:
439
- - id: tool-subagent-control
440
- name: '@deepseek-ai/dsh-tool-subagent-control'
441
- - id: tool-subagent-list-agents
442
- name: '@deepseek-ai/dsh-tool-subagent-control/list-agents'
443
- - id: tool-subagent
444
- name: '@deepseek-ai/dsh-tool-subagent'
445
- config:
446
- provider: spawn
447
- toolName: subagent
448
- modelSelectionSettings: true
449
- backgroundMode: continuable
450
- - id: tool-subagent-fork
451
- name: '@deepseek-ai/dsh-tool-subagent'
452
- config:
453
- provider: fork
454
- toolName: subagent_fork
455
- backgroundMode: continuable
456
- - id: tool-subagent-codex
457
- name: '@deepseek-ai/dsh-tool-subagent'
458
- disabled: true
459
- config:
460
- provider: codex
461
- toolName: subagent_codex
462
- backgroundMode: one-shot
463
- maxDepth: provider-managed
464
- - id: tool-subagent-claude-code
465
- name: '@deepseek-ai/dsh-tool-subagent'
466
- disabled: true
467
- config:
468
- provider: claude-code
469
- toolName: subagent_claude_code
470
- backgroundMode: one-shot
471
- maxDepth: provider-managed
472
- - id: workflow-ptc
473
- name: '@deepseek-ai/dsh-workflow-ptc'
474
- config:
475
- provider: spawn
476
- - id: tool-workflow
477
- name: '@deepseek-ai/dsh-tool-workflow'
478
- - id: tool-ralph
479
- name: '@deepseek-ai/dsh-tool-ralph'
480
- disabled: true
481
- config:
482
- subagentProvider: spawn
483
- maxRounds: 64
484
- - id: tool-ask-user
485
- name: '@deepseek-ai/dsh-tool-ask-user'
486
- - id: tool-todo
487
- name: '@deepseek-ai/dsh-tool-todo'
488
- config:
489
- allowParallelInProgress: true
490
- - id: tool-web
491
- name: '@deepseek-ai/dsh-tool-web'
492
- config:
493
- fetch: true
494
- searchTimeoutMs: 60000
495
- - id: tool-cordis
496
- name: '@deepseek-ai/dsh-tool-cordis'
497
- - id: skill-filesystem
498
- name: '@deepseek-ai/dsh-skill-filesystem'
499
- config:
500
- customSkillDirs:
501
- - !!js process.getBuiltinModule('node:path').join(process.getBuiltinModule('node:path').dirname(process.getBuiltinModule('node:module').createRequire(baseUrl).resolve('@deepseek-ai/dsh-agent-preset/package.json')), 'skills')
502
- - id: tool-skill
503
- name: '@deepseek-ai/dsh-tool-skill'
504
- - id: present
505
- name: '@deepseek-ai/dsh-tool-present'
506
- - id: tool-plugin-manager
507
- name: '@deepseek-ai/dsh-plugin-manager/tools'
508
- disabled: !!js "!ctx.get('profileContext')"
37
+ # DSH 0.2.1's optional experimental session-titles bundle disables the row above
38
+ # and inserts its own all-prompts provider row. Model Switch owns this seam as
39
+ # well, so that row is disabled by its id too; a profile that never enabled the
40
+ # bundle has no such row and the non-insert target is skipped with a warning,
41
+ # exactly like the optional auto-review row above.
42
+ - id: optional-session-title-all-prompts
43
+ name: '@deepseek-ai/dsh-session-title-all-prompts-llm'
44
+ disabled: true
509
45
 
46
+ # The Web surface runs session compaction inside each agent preset's isolated
47
+ # compaction group, and the Loader patch index cannot address rows inside a
48
+ # preset's config.plugins list. This plugin therefore bridges the nested
49
+ # compaction engine at Host startup (src/preset-sync.ts): the shipped (or a
50
+ # deployment-edited) preset definition stays authoritative, and only the
51
+ # official compaction-basic row is disabled and followed by
52
+ # model-switch-compaction. Static copies of the shipped presets are gone —
53
+ # they broke DSH 0.2.1 turns, whose prompt-variable validation rejects the
54
+ # older copies' persona suffix (unknown prompt variable {{cwd}}), and local
55
+ # copies would hide every later preset change from the deployment.
510
56
 
511
57
  - insert:
512
58
  # Register Model Switch Host Settings/Main runtime before routed Subagents.
@@ -1,4 +1,4 @@
1
- import { n as sessionProviderOf, t as resolveCapabilityRoute } from "./session-route-BCQFzqRP.js";
1
+ import { i as sessionProviderOf, r as resolveCapabilityRoute } from "./session-route-BjNPlliu.js";
2
2
  import { AsyncLocalStorage } from "node:async_hooks";
3
3
  //#region lib/types/auto-review.js
4
4
  /**
package/lib/compaction.js CHANGED
@@ -1,4 +1,4 @@
1
- import { n as sessionProviderOf, t as resolveCapabilityRoute } from "./session-route-BCQFzqRP.js";
1
+ import { i as sessionProviderOf, r as resolveCapabilityRoute } from "./session-route-BjNPlliu.js";
2
2
  //#region lib/types/compaction.js
3
3
  /** Official compaction row this module supersedes. */
4
4
  const OFFICIAL_COMPACTION_ROW = "compaction-basic";