dsh-lcx-codex 0.4.3-pre.2 → 0.4.3-pre.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,173 +4,144 @@
4
4
 
5
5
  # LCX Codex
6
6
 
7
- **让 DeepSeek Harness 中的 GPT 会话支持原生压缩、联网搜索与连续网页操作。**
7
+ **为 DeepSeek Harness 中的 GPT 提供 Responses 生命周期能力,并为 Grok 接入原生 Web / X Search。**
8
8
 
9
- [![npm](https://img.shields.io/npm/v/dsh-lcx-codex?label=npm)](https://www.npmjs.com/package/dsh-lcx-codex)
10
- [![DSH](https://img.shields.io/badge/DSH-0.1.1--rc.2-16803c)](#兼容性与限制)
9
+ [![npm prerelease](https://img.shields.io/npm/v/dsh-lcx-codex/prelatest?label=prelatest)](https://www.npmjs.com/package/dsh-lcx-codex)
10
+ [![DSH](https://img.shields.io/badge/DSH-0.1.3--alpha.2-16803c)](#安装)
11
11
  [![License](https://img.shields.io/badge/license-MIT-555)](LICENSE)
12
12
 
13
- **简体中文** · [English](README_EN.md) · [版本发布](https://github.com/kk3ya03-star/dsh-lcx-codex/releases) · [问题反馈](https://github.com/kk3ya03-star/dsh-lcx-codex/issues)
13
+ **简体中文** · [English](README_EN.md) · [更新日志](CHANGELOG.md) · [问题反馈](https://github.com/kk3ya03-star/dsh-lcx-codex/issues)
14
14
 
15
15
  </div>
16
16
 
17
- LCX Codex(`dsh-lcx-codex`)是 [DeepSeek Harness](https://github.com/deepseek-ai/DeepSeek-Harness)(DSH)的社区插件,为已配置好的 **GPT / OpenAI Responses 接口**扩展长会话和搜索能力,适用于兼容的 Sub2API、NewAPI 等通道。
17
+ LCX Codex [DeepSeek Harness](https://github.com/deepseek-ai/DeepSeek-Harness)(DSH)的社区插件。它按当前模型启用对应能力:GPT 可使用远程原生压缩、Hosted / Alpha Search;Grok 可直接使用 xAI Responses 的原生 `web_search` 与 `x_search`。其他模型继续走 DSH 原生路径。
18
18
 
19
- 你仍然在 DSH 中选择模型、管理会话和使用工具。开启 LCX 后,从普通对话到工具调用、上下文压缩和压缩后的续聊,都使用同一条 Responses 请求路径。
19
+ 模型、接口、API Key / credential、会话和工具仍由 DSH 管理,不需要在插件里再配置一遍。GPT Grok 的功能开关彼此独立;当前 Grok 原生搜索支持 API Key / API 网关调用,不包含 xAI OAuth / SuperGrok 登录。
20
20
 
21
- ## 它能做什么
21
+ ## 安装
22
22
 
23
- | 你需要 | LCX 提供 |
24
- | --- | --- |
25
- | **长对话继续进行** | 接近上下文上限时优先使用 Native V2 原生压缩,支持压缩后续聊和重启恢复。 |
26
- | **在对话中查询网页** | 通过 DSH 原有的 `web_search` 使用 GPT Hosted Search,普通搜索跟随当前 Agent 的 GPT 模型。 |
27
- | **更细的搜索控制** | 按需启用域名过滤、位置、搜索上下文大小、图片搜索等 Hosted Search 参数。 |
28
- | **连续查阅网页** | 在支持的接口上使用 Alpha 工具,连续执行搜索、打开、查找、点击等操作。 |
29
- | **复用提示词缓存** | 在支持的 GPT-5.6 接口上保持稳定的缓存标识,让相同的请求前缀可以被重复利用。 |
30
-
31
- > LCX 面向 GPT / OpenAI Responses。各项扩展能力取决于上游接口支持;能正常对话,不代表该通道同时支持原生压缩、Hosted Search 或 Alpha 网页操作。
32
-
33
- ## 快速开始
23
+ 本页对应 **`0.4.3-pre.3` 预发布版**,适配 **DSH `0.1.3-alpha.2`**。稳定版仍为 `0.4.2`,使用旧版 DSH `0.1.1-rc.2` 的用户请看[稳定版说明](https://github.com/kk3ya03-star/dsh-lcx-codex/blob/v0.4.2/README.md)。
34
24
 
35
- ### DSH 0.1.3 用户:0.4.3-pre.2 预发布
36
-
37
- `0.4.3-pre.2` 面向 **DSH `0.1.3-alpha.2` / host 与插件 Pi `0.85.1`**,安装时明确选择预发布:
25
+ 安装前,请确认 DSH Web 能正常启动,并已配置需要使用的 GPT Responses 或 Grok Responses API 路由。Node.js 要求 `^22.19.0 || >=24.0.0`;Windows 启动出现 `fs-ext` 报错时,先看下方[故障排查](#故障排查)。
38
26
 
39
27
  ```sh
40
- dsh plugin --profile web add dsh-lcx-codex@0.4.3-pre.2
28
+ dsh plugin --profile web add dsh-lcx-codex@0.4.3-pre.3
41
29
  dsh web
42
30
  ```
43
31
 
44
- 也可使用 `dsh-lcx-codex@prelatest` 跟随预发布通道。稳定通道 `latest` 仍为 `0.4.2`,对应下面的旧版安装说明,不要混用 DSH 版本。
32
+ 以后升级预发布版,可执行 `dsh plugin --profile web add dsh-lcx-codex@prelatest`。不带版本或标签安装会得到稳定版,**不是本页介绍的新版本**。
45
33
 
46
- 新版只保留 LCX、Hosted Search、高级 Hosted、Alpha 四个开关;`90%` / `95%` 压缩阈值及 `240` 秒搜索超时为固定策略。设置页语言跟随 DSH。旧版 `0.4.2` 插件配置与 v3/v4 压缩检查点不再迁移,请重新配置并新建会话;当前 v5 检查点仍支持重启续聊。
34
+ **从 `0.4.2` 升级:** 旧插件配置和 v3/v4 压缩检查点不再兼容,请重新配置插件并新建会话。新版 v5 GPT 检查点仍支持重启续聊。
47
35
 
48
- **预发布限制:** Windows 上 DSH `0.1.3-alpha.2` 存在启动时加载 `fs-ext` 的宿主问题。本轮 Windows 实测使用了仅在非 Windows 加载 `fs-ext` 的本地修正,保留原 Win32 会话锁;插件安装不会自动修补 DSH,不能宣称未修正的 Windows 宿主开箱即用。Alpha 网页引用仍可能偶发失效,`screenshot` 尚未验证返回可显示的图片。代理 / `NO_PROXY`、更高并发与取消交错、后台可续聊子代理尚未测全。
36
+ ## 启用
49
37
 
50
- 普通对话、缓存、基础 PNG/TXT 附件、Native 压缩与重启续聊、压缩后模型切换、普通搜索与 Hosted 搜图展示、双会话并发、前台子代理缓存已有有界实测;这不是全平台或所有附件格式的完整兼容保证。
38
+ 打开 DSH Web 的插件设置,展开 **Responses / Codex 能力**,按需打开开关并保存:
51
39
 
52
- ### 1. 准备环境
40
+ | 开关 | 什么时候开 |
41
+ | --- | --- |
42
+ | 启用 LCX | 使用 GPT Responses 生命周期、Native V2 压缩及 GPT 搜索能力时。 |
43
+ | GPT Hosted Search | 当前模型是 GPT,且需要普通联网查询时。 |
44
+ | 高级 Hosted 工具 | GPT 需要搜图、限定网站或使用其他 Hosted 搜索条件时。 |
45
+ | Alpha | GPT 需要连续 `open / find / click / screenshot` 网页操作时,属于实验功能。 |
46
+ | Grok 原生 Web Search | 当前模型是 Grok,并希望使用 xAI 服务端原生网页搜索时。 |
47
+ | Grok 原生 X Search | 当前模型是 Grok,并希望直接搜索 X 内容时。 |
53
48
 
54
- - DSH **`0.1.1-rc.2`**,且 Web 界面能够正常使用。
55
- - Node.js **22.19.0 及以上的 22.x,或 24.0.0 及以上版本**。
56
- - 已在 DSH 中配置好可正常对话的 **GPT Responses 接口、模型与凭据**。
49
+ **六个开关默认均关闭。** GPT 四项由“启用 LCX”控制;Grok 两项独立,不要求打开 GPT 的 LCX 主开关。模型、推理等级、图片输入、endpoint 与 credential 都继续在 DSH 的模型/provider 配置中管理。
57
50
 
58
- ### 2. 安装插件
51
+ 模型切换不需要重启插件:
59
52
 
60
- 在运行 DSH 的环境中执行:
53
+ - GPT → 只启用已打开的 GPT / LCX 能力;
54
+ - Grok → 只启用已打开的原生 Web / X Search;开启任意 Grok 原生搜索时,该请求不会同时暴露 DSH `web_search`,但 `web_fetch` 和其他 DSH/MCP 工具仍可用;
55
+ - Claude、Gemini、DeepSeek 等其他模型 → 保持 DSH 原生会话、搜索、工具和压缩行为。
61
56
 
62
- ```sh
63
- dsh plugin --profile web add dsh-lcx-codex
64
- dsh web
65
- ```
57
+ ## 搜索与搜图
66
58
 
67
- 插件通过 npm 安装,无需克隆仓库或手动下载源码。本 README 对应 **`0.4.2`**;可在 [npm](https://www.npmjs.com/package/dsh-lcx-codex) 查看发布版本,或查看 [v0.4.2 发布说明](https://github.com/kk3ya03-star/dsh-lcx-codex/releases/tag/v0.4.2)。
59
+ ### GPT 联网查询
68
60
 
69
- ### 3. 启用并保存
61
+ GPT 普通查询沿用 DSH 的单一 `web_search` 工具入口;开启 **GPT Hosted Search** 后,LCX 按当前 GPT Responses route 执行 Hosted Search。需要域名、位置、search context 或图片等额外参数时,可启用 `websearch_gpt_advanced`。
70
62
 
71
- 1. 打开 DSH Web 的插件设置,展开 **Responses / Codex 能力**。
72
- 2. 勾选 **启用 LCX(接管当前 GPT Responses 会话)**。
73
- 3. 需要联网搜索时,再勾选 **使用 GPT Hosted Search 作为 DSH web_search 后端**。
74
- 4. 保留默认压缩设置,点击 **保存**,使用已配置好的 GPT 模型开始对话。
63
+ 例如:
75
64
 
76
- **LCX 和联网搜索默认关闭,安装后需要手动启用。** 高级搜索和 Alpha 可以在需要时再开。
65
+ > 只搜索 Python 官方文档,查找 asyncio.TaskGroup 的用法。
77
66
 
78
- 切换 Claude、Gemini、DeepSeek 等非 GPT 模型前,请先关闭 LCX 并保存。模型切换本身不需要重启 DSH。
67
+ ### Grok 原生 Web / X Search
79
68
 
80
- ## 长会话如何继续
69
+ Grok 使用 xAI Responses 的服务端工具,而不是把搜索包装成 DSH function tool:
81
70
 
82
- LCX 使用上游的 **Native V2 原生压缩**处理长上下文,并将压缩结果接回 DSH 会话,供后续请求继续使用(Replay)。DSH 仍负责压缩时机、会话保存和工具执行。
71
+ ```text
72
+ { type: "web_search" }
73
+ { type: "x_search" }
74
+ ```
83
75
 
84
- 默认的 Native-first 自动压缩策略为:
76
+ 开启任意 Grok 原生搜索后,Grok 请求会移除 DSH `web_search`,避免重复搜索语义;`web_fetch`、`read` 及其他 DSH/MCP function tools 仍保持可用。原生搜索结果可以继续进入本地工具调用,再回到同一 Grok agentic workflow;插件会保存 xAI 必需的 provider-native replay state,但不会把服务端搜索伪装成 DSH 本地工具调用。
85
77
 
86
- | 上下文压力 | 行为 |
87
- | --- | --- |
88
- | 低于 `90%` | 正常运行,避免过早裁剪工具结果。 |
89
- | 达到 `90%`、低于 `95%` | 优先尝试 Native V2 压缩。 |
90
- | 达到 `95%` | 允许 DSH 紧急裁剪工具结果,并按现有流程处理压缩。 |
78
+ 当前支持 **API Key / API Gateway** 路由;OAuth / SuperGrok / X Premium 订阅登录不在本版范围内。搜索来源 URL 会尽量保留,但具体 citation 展示形式仍受上游兼容网关返回格式影响。
79
+
80
+ ### GPT 搜索图片并显示
91
81
 
92
- 手动 `/compact` 仍通过 DSH 的压缩流程执行。首次建立压缩检查点时,符合条件的可恢复失败可以回退到 DSH 基础压缩;并非所有 Native 失败都会自动回退。
82
+ 开启高级 Hosted 工具后,可以这样说:
93
83
 
94
- 原生压缩状态只在兼容的同一会话与接口配置中复用。切换到不兼容的 GPT 模型或通道时,LCX 会改用可迁移的会话历史继续请求。
84
+ > 搜索金门大桥的照片,选一张直接显示在回复里,并附上来源网页。
95
85
 
96
- ## 搜索怎么选
86
+ **不需要自己填写 JSON 参数。** 模型负责选择图片搜索参数;如果只返回文字,可以补充“请使用高级 Hosted 的图片搜索,并把图片显示出来”。
97
87
 
98
- 日常查询从 `web_search` 开始即可。三种搜索工具的用途和启用条件如下:
88
+ 搜索工具提供图片链接与来源,DSH 用现有的 Markdown 渲染器显示图片。这是**搜索已有图片,不是生成图片**,也不代表模型已经读取了图片像素。图片能否显示还取决于原站链接是否可访问。
99
89
 
100
- | 工具 | 用途 | 启用条件 |
101
- | --- | --- | --- |
102
- | `web_search` | 日常联网查询,使用 DSH 原有搜索入口。 | 开启 LCX 和 GPT Hosted Search。 |
103
- | `websearch_gpt_advanced` | 域名过滤、位置、搜索上下文大小、图片搜索等额外参数。 | 在上述基础上开启高级 Hosted 工具。 |
104
- | `websearch_alpha` | 连续执行 `search / open / find / click / screenshot` 等操作。 | 开启 Alpha,且当前接口通过能力探测。 |
90
+ ### Alpha 网页操作
105
91
 
106
- Alpha 默认关闭。即使打开开关,也只有当前接口通过能力探测后才会注册工具。
92
+ `websearch_alpha` 支持 `search / open / find / click / screenshot` 等动作,用于 GPT 连续查阅网页。它操作的是**上游搜索服务中的网页内容**,不会操作你的本机浏览器或 DSH 界面。
107
93
 
108
- ### 可以直接让 DSH 搜图吗?
94
+ Alpha 需要单独开启,且接口通过能力探测后才会出现。目前网页引用仍可能偶发失效,`screenshot` 尚未验证能返回可显示的图片。**日常 GPT 搜索/搜图和 Grok 原生搜索都不需要开启 Alpha。**
109
95
 
110
- 可以。开启 LCX、GPT Hosted Search 和高级 Hosted 工具后,直接说:
96
+ ## 长对话与压缩
111
97
 
112
- > 搜索金门大桥的照片,选一张直接显示在回复里,并附上图片来源网页。
98
+ 开启 LCX 后,插件将 DSH 的压缩请求交给上游 GPT 接口执行 **Native V2 远程原生压缩**,再将结果接回当前会话。会话保存、工具执行和压缩事务仍由 DSH 负责。
113
99
 
114
- 通常不需要自己填写 JSON,模型负责选择 `websearch_gpt_advanced` 的图片搜索参数;若只返回文字,可以补充“请使用高级 Hosted 的图片搜索”。是否选择正确参数仍取决于模型,接口也必须支持图片搜索。
100
+ | 上下文占用 | 处理方式 |
101
+ | --- | --- |
102
+ | 低于 `90%` | 正常对话,不提前裁剪工具结果。 |
103
+ | `90%` 至 `95%` | 优先尝试远程原生压缩。 |
104
+ | 达到 `95%` | 允许 DSH 紧急裁剪工具结果,再按流程压缩。 |
115
105
 
116
- 工具返回的是现有网页图片的 URL、来源等信息,模型可用 Markdown 将图片显示在 DSH 中。`0.4.3-pre.2` 已实测图片结果解析及界面展示;这是**搜索已有图片,不是生成图片,也不等于模型已经看到了图片像素**。图片链接可能受原站权限或防盗链影响。Alpha 不必开启;Alpha 的网页操作发生在上游搜索服务,不会点击你的本机浏览器或 DSH 界面,其 `screenshot` 也不保证返回照片。
106
+ 也可以输入 `/compact` 手动压缩。这些阈值是固定策略,不需要额外设置;实际能否压缩取决于是否有可压缩的历史以及接口支持情况。
117
107
 
118
- ## 缓存的使用预期
108
+ 压缩后可以继续对话、重启恢复或切换 GPT 模型。遇到不兼容的模型或接口配置时,插件改用可迁移的历史,不会强行复用原生状态。首次建立检查点时,部分可恢复失败可以回退到 DSH 基础压缩;并非所有失败都会回退。
119
109
 
120
- 在支持的 GPT-5.6 接口上,LCX 使用 `prompt_cache_options` 并保持稳定的缓存标识。连续对话和工具任务的请求前缀保持一致时,可以复用提示词缓存;实际命中情况由上游决定。
110
+ ## 缓存
121
111
 
122
- 原生压缩会改变历史内容。运行中加载 skill、plugin,或切换会改变工具列表的功能,也可能使缓存需要重新建立。新请求前缀稳定后可以再次复用缓存。
112
+ 缓存由上游服务实现,插件只负责保持与当前 provider 兼容的缓存/session identity。
123
113
 
124
- ## 设置参考
114
+ - **GPT**:延续 LCX 既有策略;前台会话与其子代理可共享父会话的 prompt-cache identity,以复用公共请求前缀。真正的 DSH Session、工具执行与私有历史仍各自独立。
115
+ - **Grok**:严格跟随 DSH/Pi 原生语义;每个前台/子代理使用自己的 DSH Session ID 作为 prompt cache / session affinity identity,sibling 子代理不会共享 opaque replay state。
125
116
 
126
- 下表为稳定版 `0.4.2`。`0.4.3-pre.2` 只提供前四项开关,其余为固定内部策略。
117
+ Pi `0.85.1` 的显式缓存模式支持 `30m` 长保留参数;`cacheRetention=none` 时不发送 prompt cache key。压缩、切换模型或改变工具列表后,缓存可能需要重新建立。
127
118
 
128
- | 设置 | 默认值 | 建议 |
129
- | --- | --- | --- |
130
- | 启用 LCX | 关闭 | 使用 GPT Responses 时开启。 |
131
- | GPT Hosted Search | 关闭 | 需要联网查询时开启。 |
132
- | 高级 Hosted 工具 | 关闭 | 需要额外搜索参数时开启。 |
133
- | Alpha command | 关闭 | 在支持的接口上按需开启。 |
134
- | Native-first 自动压缩 | 开启 | 保持默认,需先启用 LCX。 |
135
- | Native 自动压缩阈值 | `90%` | 保持默认。 |
136
- | DSH 紧急裁剪阈值 | `95%` | 必须高于 Native 阈值。 |
137
- | Native 失败后回退 DSH basic compaction | 开启 | 保留符合回退条件时的基础压缩能力。 |
138
- | `web_search` 超时 | `240` 秒 | 搜索较慢时再调整。 |
119
+ ## 故障排查
139
120
 
140
- ## 常见问题
121
+ **DSH 在 Windows 启动时报 `fs-ext` 错误?**
141
122
 
142
- **安装后没有变化?**
123
+ DSH `0.1.3-alpha.2` 会在启动时加载 `fs-ext`,即使 Windows 实际不使用它。当它的原生模块不可用时,DSH 会在启动阶段退出。这是 **DSH 的依赖加载问题,不是插件压缩或会话锁损坏**。
143
124
 
144
- 确认插件安装到了启动 Web 使用的 `web` 配置中,再检查 LCX 是否已经勾选并保存。联网搜索有单独的开关。
125
+ 本版 Windows 实测使用了一个最小 DSH 修正:仅在非 Windows 平台加载 `fs-ext`,保留原有 Win32 会话锁。插件不会自动修改 DSH;未经该修正的 Windows 环境不保证能启动。不要用关闭会话锁来绕过问题。
145
126
 
146
- **能对话,但搜索或压缩报错?**
127
+ **安装后没有变化?**
147
128
 
148
- 检查当前通道是否支持对应能力,以及模型与凭据是否可用。Sub2API、NewAPI 的名称本身不代表其所有通道都支持相同功能。
129
+ 检查安装和启动是否使用同一个 `web` 配置,并确认对应模型的开关已保存。GPT 主开关与 Grok Web/X 开关彼此独立。
149
130
 
150
- **需要手动下载安装包吗?**
131
+ **对话正常,但搜索或压缩失败?**
151
132
 
152
- 常规安装使用上面的 DSH 命令即可。需要留存发布包时,可下载 [v0.4.2 npm 包(.tgz)](https://registry.npmjs.org/dsh-lcx-codex/-/dsh-lcx-codex-0.4.2.tgz)。GitHub **Code Download ZIP** 提供源码,不能代替插件安装步骤。
133
+ 普通 Responses 对话可用,不代表接口同时支持 Native V2、Hosted/Alpha Grok 原生 Web/X Search。请确认当前通道提供对应服务端能力;Sub2API、NewAPI 或其他网关名称本身不是能力保证。
153
134
 
154
- ## 兼容性与限制
135
+ ## 版本与验证范围
155
136
 
156
- | 组件 | `0.4.2` 对应版本 |
157
- | --- | --- |
158
- | DSH | `0.1.1-rc.2` |
159
- | DSH host Pi | `0.82.1` |
160
- | 插件 Pi | `0.84.3` |
161
- | Node.js | `^22.19.0 \|\| >=24.0.0` |
137
+ 本版使用 DSH `0.1.3-alpha.2`、DSH host Pi `0.85.1` 和插件 Pi `0.85.1`。插件单独声明 Pi 依赖,不替换 DSH 的依赖。
162
138
 
163
- 插件单独使用 `@earendil-works/pi-ai@0.84.3`,不覆盖 DSH host Pi 依赖。
139
+ 发布前完整测试为 **237/237 PASS**,strict host/client typecheck 与 4 个 DSH schema 均通过。真实运行覆盖 GPT Hosted/Native V2 回归、DeepSeek 原生 DSH 搜索回归,以及 Grok 4.5/4.6 原生 Web/X Search、Web/X → 本地 `read` → continuation、provider-native replay、完整 DSH 重启后的续聊、Grok 父/子代理 session/cache 隔离。GPT 已验证的父 cache-sharing 策略保持不变。
164
140
 
165
- - DSH `0.1.2-alpha.1` 尚未列入此版本的正式兼容范围。
166
- - 1.05M 长上下文和 Programmatic Tool Calling 暂不作为正式支持项。
167
- - 显式 `prompt_cache_breakpoint` 设置未开放。
168
- - `reasoning.context` 和 `reasoning.mode` 是否可用,取决于 DSH / Pi 是否暴露相应字段。
141
+ 仍需保留的预发布限制:Windows DSH `0.1.3-alpha.2` 的 `fs-ext` 启动问题需要文档中的最小 host loading 修正;Alpha 引用及 screenshot 展示、代理/NO_PROXY、更广的并发/取消和后台 continuable subagent 矩阵仍未全面覆盖;Grok OAuth 不支持,citation 渲染仍可能受上游网关格式影响。详细变更见 [v0.4.3-pre.3 发布说明](https://github.com/kk3ya03-star/dsh-lcx-codex/releases/tag/v0.4.3-pre.3)。
169
142
 
170
143
  ## 开发与反馈
171
144
 
172
- 在仓库中安装依赖并运行检查:
173
-
174
145
  ```sh
175
146
  npm ci --ignore-scripts
176
147
  npm ci --prefix scripts/runtime-alpha2 --ignore-scripts
@@ -179,13 +150,10 @@ node scripts/check-generated.mjs
179
150
  npm run typecheck
180
151
  npm test
181
152
  npm run test:schema
182
- npm pack --ignore-scripts
183
153
  ```
184
154
 
185
- [架构说明](ARCHITECTURE.md)介绍请求生命周期、压缩检查点和 Replay 实现;[更新日志](CHANGELOG.md)记录版本变化。
186
-
187
- 遇到问题可提交 [Issue](https://github.com/kk3ya03-star/dsh-lcx-codex/issues),附上插件、DSH、Node.js 版本、接口类型、复现步骤和已脱敏的报错信息。
155
+ 实现细节见[架构说明](ARCHITECTURE.md)。提交 [Issue](https://github.com/kk3ya03-star/dsh-lcx-codex/issues) 时,请附上插件、DSH、Node.js 版本及复现步骤,不要上传 API Key、完整请求或未脱敏的会话日志。
188
156
 
189
157
  ## 许可证
190
158
 
191
- [MIT](LICENSE)。本项目是独立社区插件,与 OpenAI、DeepSeek、Sub2API、NewAPI 无隶属或官方背书关系。DeepSeek 名称及鲸鱼标识归其权利人所有。
159
+ [MIT](LICENSE)。独立社区插件,与 OpenAI、DeepSeek、Sub2API、NewAPI 无隶属或官方背书关系。DeepSeek 名称及标识归其权利人所有。
package/lib/client.js CHANGED
@@ -13,12 +13,14 @@ window.__ModuleLoader__.load({
13
13
  "enabled",
14
14
  "webSearch",
15
15
  "advancedHostedSearch",
16
- "alphaSearch"
16
+ "alphaSearch",
17
+ "grokNativeWebSearch",
18
+ "grokNativeXSearch"
17
19
  ];
18
20
  const DEFAULTS = Object.fromEntries(
19
21
  FIELDS.map((field) => [field, false])
20
22
  );
21
- const css = `.lcx-card{border:1px solid var(--dsw-alias-border-l2);border-radius:12px;list-style:none}.lcx-head{width:100%;display:flex;justify-content:space-between;padding:14px 16px;border:0;background:transparent;color:inherit}.lcx-body{border-top:1px solid var(--dsw-alias-border-l2);padding:12px 16px}.lcx-row{display:flex;gap:9px;padding:8px 0}.lcx-row small,.lcx-help{display:block;font-size:12px;line-height:17px;color:var(--dsw-alias-label-tertiary)}.lcx-foot{display:flex;justify-content:flex-end;gap:8px;margin-top:10px}.lcx-foot button{padding:6px 12px;border-radius:8px;border:1px solid var(--dsw-alias-border-l2);background:transparent;color:inherit}`;
23
+ const css = `.lcx-card{border:1px solid var(--dsw-alias-border-l2);border-radius:12px;list-style:none}.lcx-head{width:100%;display:flex;justify-content:space-between;padding:14px 16px;border:0;background:transparent;color:inherit}.lcx-body{border-top:1px solid var(--dsw-alias-border-l2);padding:12px 16px}.lcx-row{display:flex;gap:9px;padding:8px 0}.lcx-row small,.lcx-help{display:block;font-size:12px;line-height:17px;color:var(--dsw-alias-label-tertiary)}.lcx-group{border-top:1px solid var(--dsw-alias-border-l2);margin-top:10px;padding-top:14px}.lcx-group strong{font-size:14px}.lcx-foot{display:flex;justify-content:flex-end;gap:8px;margin-top:10px}.lcx-foot button{padding:6px 12px;border-radius:8px;border:1px solid var(--dsw-alias-border-l2);background:transparent;color:inherit}`;
22
24
  if (typeof document !== "undefined" && !document.querySelector('style[data-plugin-css="dsh-lcx-codex"]')) {
23
25
  const tag = document.createElement("style");
24
26
  tag.dataset.pluginCss = "dsh-lcx-codex";
@@ -30,13 +32,19 @@ window.__ModuleLoader__.load({
30
32
  title: "Responses / Codex \u80FD\u529B",
31
33
  desc: "LCX \u8DDF\u968F DSH \u5F53\u524D\u4F1A\u8BDD\u9009\u62E9\u7684 GPT Responses route\uFF1B\u6A21\u578B\u3001endpoint \u548C credential \u7EE7\u7EED\u53EA\u7531 DSH \u7BA1\u7406\u3002",
32
34
  enabled: "\u542F\u7528 LCX\uFF08\u63A5\u7BA1\u5F53\u524D GPT Responses \u4F1A\u8BDD\uFF09",
33
- enabledHelp: "\u5207\u6362 Claude\u3001Gemini\u3001DeepSeek \u7B49\u975E GPT \u6A21\u578B\u524D\u5148\u5173\u95ED LCX\uFF1B\u6A21\u578B\u5207\u6362\u672C\u8EAB\u4E0D\u9700\u8981\u91CD\u542F DSH\u3002",
35
+ enabledHelp: "\u6B64\u5F00\u5173\u4EC5\u63A5\u7BA1 GPT Responses \u4F1A\u8BDD\uFF1BGrok \u539F\u751F\u641C\u7D22\u7531\u4E0B\u65B9\u72EC\u7ACB\u5F00\u5173\u63A7\u5236\uFF0C\u5176\u4ED6\u975E GPT \u6A21\u578B\u7EE7\u7EED\u4F7F\u7528 DSH \u539F\u751F\u8DEF\u5F84\u3002",
34
36
  web: "\u4F7F\u7528 GPT Hosted Search \u4F5C\u4E3A DSH web_search \u540E\u7AEF",
35
37
  webHelp: "\u4E0D\u4F1A\u65B0\u589E\u7B2C\u4E8C\u4E2A\u666E\u901A\u641C\u7D22\u5DE5\u5177\uFF1B\u666E\u901A web_search \u81EA\u52A8\u8DDF\u968F\u5F53\u524D Agent \u7684 GPT Responses route\u3002",
36
38
  advanced: "\u542F\u7528\u9AD8\u7EA7 Hosted \u5DE5\u5177\uFF08websearch_gpt_advanced\uFF09",
37
39
  advancedHelp: "\u53EA\u5728\u9700\u8981\u57DF\u540D\u8FC7\u6EE4\u3001\u4F4D\u7F6E\u3001search context\u3001\u56FE\u7247\u7B49\u539F\u751F Hosted \u53C2\u6570\u65F6\u4F7F\u7528\uFF1B\u9ED8\u8BA4\u5173\u95ED\u4EE5\u4FDD\u6301\u5DE5\u5177 schema \u7A33\u5B9A\u3002",
38
40
  alpha: "\u542F\u7528 Alpha command\uFF08websearch_alpha\uFF09",
39
41
  alphaHelp: "\u4EC5 capability probe \u5BF9\u5F53\u524D route/schema \u9A8C\u8BC1\u901A\u8FC7\u540E\u624D\u771F\u6B63\u6CE8\u518C\u3002",
42
+ grokTitle: "Grok \u539F\u751F\u641C\u7D22",
43
+ grokDesc: "\u4F7F\u7528 DSH \u5F53\u524D\u9009\u62E9\u7684 Grok \u6A21\u578B\u53CA\u5176\u670D\u52A1\u914D\u7F6E\uFF1B\u4E0E GPT \u529F\u80FD\u5F00\u5173\u72EC\u7ACB\u3002\u5F00\u542F\u4EFB\u4E00\u641C\u7D22\u540E\uFF0CGrok \u4EC5\u4F7F\u7528\u539F\u751F\u641C\u7D22\uFF0C\u7F51\u9875\u8BFB\u53D6\u548C\u5176\u4ED6\u5DE5\u5177\u4ECD\u53EF\u7528\u3002",
44
+ grokWeb: "\u542F\u7528\u539F\u751F Web Search",
45
+ grokWebHelp: "\u4F7F\u7528 Grok \u7684\u539F\u751F\u7F51\u9875\u641C\u7D22\u3002",
46
+ grokX: "\u542F\u7528\u539F\u751F X Search",
47
+ grokXHelp: "\u4F7F\u7528 Grok \u7684\u539F\u751F X \u641C\u7D22\uFF1B\u5355\u72EC\u5F00\u542F\u4E5F\u4E0D\u4F1A\u4F7F\u7528 DSH \u641C\u7D22\u3002",
40
48
  save: "\u4FDD\u5B58",
41
49
  discard: "\u653E\u5F03\u4FEE\u6539",
42
50
  saving: "\u4FDD\u5B58\u4E2D\u2026",
@@ -46,13 +54,19 @@ window.__ModuleLoader__.load({
46
54
  title: "Responses / Codex capabilities",
47
55
  desc: "LCX follows the GPT Responses route selected by the current DSH session. Model, endpoint and credentials remain DSH-owned.",
48
56
  enabled: "Enable LCX (own current GPT Responses conversation)",
49
- enabledHelp: "Turn LCX off before switching to Claude, Gemini, DeepSeek, or another non-GPT model. Model switching itself does not require a DSH restart.",
57
+ enabledHelp: "Applies only to GPT Responses conversations. Grok native search is controlled independently below; other non-GPT models continue through DSH normally.",
50
58
  web: "Use GPT Hosted Search as DSH web_search backend",
51
59
  webHelp: "Keeps DSH web_search as the single ordinary search tool and follows the active Agent GPT Responses route.",
52
60
  advanced: "Enable advanced Hosted tool (websearch_gpt_advanced)",
53
61
  advancedHelp: "Only for native Hosted controls such as domains, location, context size and image search; off by default for stable tool schemas.",
54
62
  alpha: "Enable Alpha command (websearch_alpha)",
55
63
  alphaHelp: "Registered only after a matching capability probe.",
64
+ grokTitle: "Grok native search",
65
+ grokDesc: "Uses the Grok model and provider profile currently selected in DSH, independently of the GPT switch. When either search is enabled, Grok uses native search while page reading and other tools remain available.",
66
+ grokWeb: "Enable native Web Search",
67
+ grokWebHelp: "Use Grok's native web search.",
68
+ grokX: "Enable native X Search",
69
+ grokXHelp: "Use Grok's native X search. Enabling it alone also avoids DSH search.",
56
70
  save: "Save",
57
71
  discard: "Discard",
58
72
  saving: "Saving\u2026",
@@ -245,6 +259,28 @@ window.__ModuleLoader__.load({
245
259
  disabled: disabled || !s.enabled.value,
246
260
  onChange: (value) => props.edit("alphaSearch", value)
247
261
  }),
262
+ React.createElement(
263
+ "section",
264
+ { className: "lcx-group" },
265
+ React.createElement("strong", null, t("grokTitle")),
266
+ React.createElement("p", { className: "lcx-help" }, t("grokDesc")),
267
+ React.createElement(Row, {
268
+ id: "lcx-grok-web",
269
+ label: t("grokWeb"),
270
+ help: t("grokWebHelp"),
271
+ checked: s.grokNativeWebSearch.value,
272
+ disabled,
273
+ onChange: (value) => props.edit("grokNativeWebSearch", value)
274
+ }),
275
+ React.createElement(Row, {
276
+ id: "lcx-grok-x",
277
+ label: t("grokX"),
278
+ help: t("grokXHelp"),
279
+ checked: s.grokNativeXSearch.value,
280
+ disabled,
281
+ onChange: (value) => props.edit("grokNativeXSearch", value)
282
+ })
283
+ ),
248
284
  React.createElement(
249
285
  "p",
250
286
  { role: "alert", hidden: !s.saveError },
package/lib/dsh-compat.js CHANGED
@@ -29,9 +29,14 @@ export function readAgentRouteState(agent) {
29
29
  }
30
30
  export function scopedToolRuntime(agent) {
31
31
  const tools = resolveScopedService(agent, "tools");
32
- return mutableService(tools) && typeof tools.register === "function"
33
- ? { register: tools.register.bind(tools) }
34
- : undefined;
32
+ if (!mutableService(tools) || typeof tools.register !== "function")
33
+ return undefined;
34
+ return {
35
+ register: tools.register.bind(tools),
36
+ ...(typeof tools.get === "function"
37
+ ? { get: tools.get.bind(tools) }
38
+ : {}),
39
+ };
35
40
  }
36
41
  export function tokenMeterTotal(value, session) {
37
42
  if (!mutableService(value) || typeof value.measure !== "function")