dsh-codex-subscription 2.2.4 → 2.2.5

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
@@ -35,8 +35,10 @@ Subscription access, model controls, quota management, and image creation in one
35
35
  | **Reasoning levels** | Choose supported reasoning effort in the composer | Levels vary by model |
36
36
  | **Fast mode** | Switch supported models between Standard and Fast, with a lightning indicator | Standard by default; Fast increases usage |
37
37
  | **Response verbosity** | Request short, medium, or detailed responses | Follows the model default unless changed |
38
+ | **Input image detail** | Choose Low, High, Original, or Auto detail for images sent to the chat model | Affects input tokens; Auto by default |
38
39
  | **Subscription web search** | Use Codex search or choose DSH search | Auto, DSH, and Codex routing options |
39
40
  | **Search scope** | Choose live / cached search, disable search, or restrict domains | Configure under Models & runtime |
41
+ | **Stream inactivity timeout** | Set how long a request can receive no streamed data before it is aborted | 10 minutes by default; not an overall response deadline |
40
42
  | **Context budget** | Use standard, extended, or custom budgets per model | Limited by the model catalog |
41
43
  | **GPT-Reserve** | Select the reserve model when your account offers it | Experimental; no promise of a separate reserve quota |
42
44
 
@@ -85,7 +87,7 @@ Subscription access, model controls, quota management, and image creation in one
85
87
 
86
88
  ## Prepare DSH
87
89
 
88
- Compatible with DSH `0.1.7-rc.2` plugin compatibility checks and settings APIs, while retaining support for previously supported versions.
90
+ Compatible with DSH `0.2.0-rc.1` plugin compatibility checks and settings APIs, while retaining support for previously supported versions.
89
91
 
90
92
  This plugin supports the latest DeepSeek Harness release recorded in its package metadata and requires a ChatGPT account that currently has Codex access.
91
93
 
package/README.md CHANGED
@@ -35,8 +35,10 @@
35
35
  | **推理等级** | 在输入框选择模型支持的推理档位 | 档位随模型变化 |
36
36
  | **高速模式** | 在支持的模型上切换标准 / Fast,输入框显示闪电标识 | 默认标准;Fast 会增加用量消耗 |
37
37
  | **输出详略** | 选择简短、适中或详细的回答偏好 | 默认跟随模型 |
38
+ | **输入图片精度** | 为发送给聊天模型的图片选择低、高、原图或自动精度 | 影响输入 token 用量;默认自动 |
38
39
  | **订阅联网搜索** | 使用 Codex 搜索,或选择 DSH 搜索 | 可选自动、DSH、Codex 路由 |
39
40
  | **搜索范围** | 选择实时 / 缓存搜索、关闭搜索,或限定域名 | 在模型与运行中设置 |
41
+ | **流无响应超时** | 设置连续没有收到流式数据时中断请求的时长 | 默认 10 分钟;不是整体回答时限 |
40
42
  | **上下文预算** | 按模型使用标准、扩展或自定义上下文预算 | 受模型目录上限约束 |
41
43
  | **GPT-Reserve** | 在账号开放时选择备用模型入口 | 实验性;不承诺独立备用额度 |
42
44
 
@@ -85,7 +87,7 @@
85
87
 
86
88
  ## 准备 DSH
87
89
 
88
- 已适配 DSH `0.1.7-rc.2` 的插件兼容性检查与设置接口,同时保留已支持版本的兼容。
90
+ 已适配 DSH `0.2.0-rc.1` 的插件兼容性检查与设置接口,同时保留已支持版本的兼容。
89
91
 
90
92
  本插件支持软件包元数据中记录的最新版 DeepSeek Harness,并需要一个当前具有 Codex 使用资格的 ChatGPT 账户。
91
93
 
@@ -1,12 +1,13 @@
1
1
  {
2
- "latestTested": "0.1.7-rc.2",
2
+ "latestTested": "0.2.0-rc.1",
3
3
  "supported": [
4
4
  "0.1.2-rc.1",
5
5
  "0.1.5-rc.1",
6
6
  "0.1.5-rc.2",
7
7
  "0.1.5-rc.3",
8
8
  "0.1.7-rc.1",
9
- "0.1.7-rc.2"
9
+ "0.1.7-rc.2",
10
+ "0.2.0-rc.1"
10
11
  ],
11
12
  "previews": [
12
13
  "0.1.5-alpha.1",
package/lib/client.js CHANGED
@@ -4724,11 +4724,24 @@ window.__ModuleLoader__.load({
4724
4724
  compaction_cloud: "开启",
4725
4725
  compactionHint: "实验功能,默认关闭。长上下文由 Codex 压缩后继续请求,保留 DSH 历史与原生压缩。开启时该请求使用 SSE;历史改变后重新建立压缩状态。",
4726
4726
  advancedModelSearch: "模型与搜索",
4727
+ inputImageDetail: "输入图片精度",
4728
+ inputImageDetailHint: "控制发送给模型的图片精度,精度越高输入 token 用量越大。",
4729
+ inputImageDetail_auto: "自动",
4730
+ inputImageDetail_low: "低",
4731
+ inputImageDetail_high: "高",
4732
+ inputImageDetail_original: "原图",
4727
4733
  subagentBackendTitle: "独立子任务",
4728
4734
  subagentBackend_dsh: "DSH",
4729
4735
  subagentBackend_codex: "Codex",
4730
4736
  connectionTitle: "连接方式",
4731
4737
  connectionHint: "默认 SSE。WebSocket 实验性复用连接与上下文传输;连接失败可回退 SSE。下次请求生效,不扩大上下文容量。",
4738
+ streamIdleTimeoutTitle: "流无响应超时",
4739
+ streamIdleTimeoutHint: "连续多久没有收到任何流式数据时中断本次请求,不是整体回答时限。调低可能中断较慢但仍在推理的回答,并交由 DSH 重试处理。默认 10 分钟。",
4740
+ streamIdleTimeout_2: "2 分钟",
4741
+ streamIdleTimeout_5: "5 分钟",
4742
+ streamIdleTimeout_10: "10 分钟",
4743
+ streamIdleTimeout_20: "20 分钟",
4744
+ streamIdleTimeout_30: "30 分钟",
4732
4745
  subagentBackendHint: "Codex 复用订阅登录和工作区权限;默认继承当前订阅模型。开启 DSH 子任务模型选择并新建会话后,可在聊天中指定允许的订阅模型与推理档位;非订阅会话需指定。共享上下文子任务仍用 DSH。",
4733
4746
  subagentBackendUnavailable: "当前宿主缺少子代理服务,请更新 DSH。",
4734
4747
  subagentRuntimeMissing: "尚未准备 Codex 子任务运行时,仅影响此选项。普通订阅对话无需安装。",
@@ -5259,11 +5272,24 @@ window.__ModuleLoader__.load({
5259
5272
  compaction_cloud: "On",
5260
5273
  compactionHint: "Experimental, off by default. Codex compacts long requests while DSH history and native compaction remain available. These requests use SSE; changed history invalidates previous checkpoints.",
5261
5274
  advancedModelSearch: "Models and search",
5275
+ inputImageDetail: "Input image detail",
5276
+ inputImageDetailHint: "Controls the detail level of images sent to the model. Higher detail uses more input tokens.",
5277
+ inputImageDetail_auto: "Auto",
5278
+ inputImageDetail_low: "Low",
5279
+ inputImageDetail_high: "High",
5280
+ inputImageDetail_original: "Original",
5262
5281
  subagentBackendTitle: "Independent subtasks",
5263
5282
  subagentBackend_dsh: "DSH",
5264
5283
  subagentBackend_codex: "Codex",
5265
5284
  connectionTitle: "Connection",
5266
5285
  connectionHint: "SSE by default. Experimental WebSocket reuses connections and context transfers and can fall back to SSE on connection failure. Applies to the next request; context limits stay the same.",
5286
+ streamIdleTimeoutTitle: "Stream inactivity timeout",
5287
+ streamIdleTimeoutHint: "How long a request may receive no streamed data before it is aborted. This is not an overall response deadline. Lower values can abort slow but valid reasoning and hand the request to DSH retry handling. Default: 10 minutes.",
5288
+ streamIdleTimeout_2: "2 min",
5289
+ streamIdleTimeout_5: "5 min",
5290
+ streamIdleTimeout_10: "10 min",
5291
+ streamIdleTimeout_20: "20 min",
5292
+ streamIdleTimeout_30: "30 min",
5267
5293
  subagentBackendHint: "Codex reuses subscription login and workspace permissions, inheriting the current subscription model by default. Enable DSH subtask model selection and start a new session to request an allowed subscription model and reasoning effort in chat; other model sessions require an explicit selection. Shared-context subtasks stay in DSH.",
5268
5294
  subagentBackendUnavailable: "Subagent services are unavailable. Update DSH to use this option.",
5269
5295
  subagentRuntimeMissing: "Codex subtask runtime is not prepared. Subscription chat does not require it.",
@@ -7000,6 +7026,22 @@ window.__ModuleLoader__.load({
7000
7026
  const OUTPUT_VERBOSITY_MEDIUM = "medium";
7001
7027
  const OUTPUT_VERBOSITY_HIGH = "high";
7002
7028
  const DEFAULT_OUTPUT_VERBOSITY = OUTPUT_VERBOSITY_DEFAULT;
7029
+ const INPUT_IMAGE_DETAIL_FIELD = "inputImageDetail";
7030
+ const INPUT_IMAGE_DETAILS = Object.freeze([
7031
+ "low",
7032
+ "high",
7033
+ "original",
7034
+ "auto"
7035
+ ]);
7036
+ const DEFAULT_INPUT_IMAGE_DETAIL = "auto";
7037
+ const STREAM_IDLE_TIMEOUT_MINUTES_FIELD = "streamIdleTimeoutMinutes";
7038
+ const STREAM_IDLE_TIMEOUT_MINUTES = Object.freeze([
7039
+ 2,
7040
+ 5,
7041
+ 10,
7042
+ 20,
7043
+ 30
7044
+ ]);
7003
7045
  const CONTEXT_MODE_FIELD = "contextMode";
7004
7046
  const CONTEXT_MODE_STANDARD = "standard";
7005
7047
  const CONTEXT_MODE_EXTENDED = "extended";
@@ -7042,6 +7084,8 @@ window.__ModuleLoader__.load({
7042
7084
  "medium",
7043
7085
  "high"
7044
7086
  ].includes(value) ? value : DEFAULT_OUTPUT_VERBOSITY;
7087
+ const normalizeInputImageDetail = (value) => INPUT_IMAGE_DETAILS.includes(value) ? value : DEFAULT_INPUT_IMAGE_DETAIL;
7088
+ const normalizeStreamIdleTimeoutMinutes = (value) => STREAM_IDLE_TIMEOUT_MINUTES.includes(value) ? value : 10;
7045
7089
  const normalizeSpeedMode = (value) => ["standard", "fast"].includes(value) ? value : DEFAULT_SPEED_MODE;
7046
7090
  const normalizeContextMode = (value) => [
7047
7091
  "standard",
@@ -7112,6 +7156,8 @@ window.__ModuleLoader__.load({
7112
7156
  searchProvider: normalizeSearchProvider(value?.[SEARCH_PROVIDER_FIELD]),
7113
7157
  speedMode: normalizeSpeedMode(value?.[SPEED_MODE_FIELD]),
7114
7158
  outputVerbosity: normalizeOutputVerbosity(value?.[OUTPUT_VERBOSITY_FIELD]),
7159
+ inputImageDetail: normalizeInputImageDetail(value?.[INPUT_IMAGE_DETAIL_FIELD]),
7160
+ streamIdleTimeoutMinutes: normalizeStreamIdleTimeoutMinutes(value?.[STREAM_IDLE_TIMEOUT_MINUTES_FIELD]),
7115
7161
  contextMode: normalizeContextMode(value?.[CONTEXT_MODE_FIELD]),
7116
7162
  customContextWindow: normalizeCustomContextWindow(value?.[CUSTOM_CONTEXT_WINDOW_FIELD]),
7117
7163
  customContextWindows: {
@@ -7162,6 +7208,8 @@ window.__ModuleLoader__.load({
7162
7208
  [SEARCH_PROVIDER_FIELD]: normalizeSearchProvider(value?.[SEARCH_PROVIDER_FIELD]),
7163
7209
  [SPEED_MODE_FIELD]: normalizeSpeedMode(value?.[SPEED_MODE_FIELD]),
7164
7210
  [OUTPUT_VERBOSITY_FIELD]: normalizeOutputVerbosity(value?.[OUTPUT_VERBOSITY_FIELD]),
7211
+ [INPUT_IMAGE_DETAIL_FIELD]: normalizeInputImageDetail(value?.[INPUT_IMAGE_DETAIL_FIELD]),
7212
+ [STREAM_IDLE_TIMEOUT_MINUTES_FIELD]: normalizeStreamIdleTimeoutMinutes(value?.[STREAM_IDLE_TIMEOUT_MINUTES_FIELD]),
7165
7213
  [CONTEXT_MODE_FIELD]: normalizeContextMode(value?.[CONTEXT_MODE_FIELD]),
7166
7214
  [CUSTOM_CONTEXT_WINDOW_FIELD]: normalizeCustomContextWindow(value?.[CUSTOM_CONTEXT_WINDOW_FIELD]),
7167
7215
  ...Object.fromEntries(Object.entries(CUSTOM_CONTEXT_MODEL_FIELDS).map(([modelKey, field]) => [field, normalizeCustomContextWindow(value?.[field] ?? CUSTOM_CONTEXT_MODEL_DEFAULTS[modelKey], CUSTOM_CONTEXT_MODEL_CAPS[modelKey])]))
@@ -7575,7 +7623,7 @@ window.__ModuleLoader__.load({
7575
7623
  }
7576
7624
  //#endregion
7577
7625
  //#region src/version.js
7578
- const PACKAGE_VERSION = "2.2.4";
7626
+ const PACKAGE_VERSION = "2.2.5";
7579
7627
  //#endregion
7580
7628
  //#region src/client-recovery.js
7581
7629
  async function recoveryCall(rpc, endpoint, payload = {}, timeoutMs = 1e4) {
@@ -8744,6 +8792,76 @@ window.__ModuleLoader__.load({
8744
8792
  })]
8745
8793
  });
8746
8794
  }
8795
+ function InputImageDetailPreference({ preference, t }) {
8796
+ const snapshot = usePreferenceSnapshot(preference);
8797
+ const writable = snapshot.status === "ready" && snapshot.writable === true;
8798
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8799
+ className: "codexSubscriptionPreference",
8800
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8801
+ className: "codexSubscriptionPreferenceCopy",
8802
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8803
+ className: "codexSubscriptionPreferenceLabel",
8804
+ children: t("inputImageDetail")
8805
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8806
+ className: "codexSubscriptionPreferenceHint",
8807
+ children: t("inputImageDetailHint")
8808
+ })]
8809
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8810
+ className: "codexSubscriptionQuotaModes",
8811
+ "data-saving": snapshot.saving || void 0,
8812
+ "aria-busy": snapshot.saving || void 0,
8813
+ role: "radiogroup",
8814
+ "aria-label": t("inputImageDetail"),
8815
+ children: INPUT_IMAGE_DETAILS.map((value) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
8816
+ className: "codexSubscriptionQuotaMode",
8817
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
8818
+ type: "radio",
8819
+ name: "codex-input-image-detail",
8820
+ checked: snapshot.inputImageDetail === value,
8821
+ disabled: !writable,
8822
+ onChange: () => {
8823
+ preference.set({ [INPUT_IMAGE_DETAIL_FIELD]: value });
8824
+ }
8825
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t(`inputImageDetail_${value}`) })]
8826
+ }, value))
8827
+ })]
8828
+ });
8829
+ }
8830
+ function StreamIdleTimeoutPreference({ preference, t }) {
8831
+ const snapshot = usePreferenceSnapshot(preference);
8832
+ const writable = snapshot.status === "ready" && snapshot.writable === true;
8833
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8834
+ className: "codexSubscriptionPreference",
8835
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8836
+ className: "codexSubscriptionPreferenceCopy",
8837
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8838
+ className: "codexSubscriptionPreferenceLabel",
8839
+ children: t("streamIdleTimeoutTitle")
8840
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8841
+ className: "codexSubscriptionPreferenceHint",
8842
+ children: t("streamIdleTimeoutHint")
8843
+ })]
8844
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8845
+ className: "codexSubscriptionQuotaModes",
8846
+ "data-saving": snapshot.saving || void 0,
8847
+ "aria-busy": snapshot.saving || void 0,
8848
+ role: "radiogroup",
8849
+ "aria-label": t("streamIdleTimeoutTitle"),
8850
+ children: STREAM_IDLE_TIMEOUT_MINUTES.map((value) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
8851
+ className: "codexSubscriptionQuotaMode",
8852
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
8853
+ type: "radio",
8854
+ name: "codex-stream-idle-timeout",
8855
+ checked: snapshot.streamIdleTimeoutMinutes === value,
8856
+ disabled: !writable,
8857
+ onChange: () => {
8858
+ preference.set({ [STREAM_IDLE_TIMEOUT_MINUTES_FIELD]: value });
8859
+ }
8860
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t(`streamIdleTimeout_${value}`) })]
8861
+ }, value))
8862
+ })]
8863
+ });
8864
+ }
8747
8865
  function ContextWindowPreference({ preference, t }) {
8748
8866
  const snapshot = usePreferenceSnapshot(preference);
8749
8867
  const writable = snapshot.status === "ready" && snapshot.writable === true;
@@ -8922,46 +9040,58 @@ window.__ModuleLoader__.load({
8922
9040
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ContextWindowPreference, {
8923
9041
  preference,
8924
9042
  t
9043
+ }),
9044
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "codexSubscriptionDivider" }),
9045
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(InputImageDetailPreference, {
9046
+ preference,
9047
+ t
8925
9048
  })
8926
9049
  ]
8927
9050
  }),
8928
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("section", {
9051
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
8929
9052
  className: "codexSubscriptionCard codexSubscriptionPreferencesCard",
8930
9053
  "aria-label": t("connectionTitle"),
8931
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8932
- className: "codexSubscriptionPreference",
8933
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8934
- className: "codexSubscriptionPreferenceCopy",
8935
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
8936
- className: "codexSubscriptionPreferenceLabel",
8937
- children: [
8938
- t("connectionTitle"),
8939
- " ",
8940
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: "Beta" })
8941
- ]
8942
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8943
- className: "codexSubscriptionPreferenceHint",
8944
- children: t("connectionHint")
9054
+ children: [
9055
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
9056
+ className: "codexSubscriptionPreference",
9057
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
9058
+ className: "codexSubscriptionPreferenceCopy",
9059
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
9060
+ className: "codexSubscriptionPreferenceLabel",
9061
+ children: [
9062
+ t("connectionTitle"),
9063
+ " ",
9064
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: "Beta" })
9065
+ ]
9066
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
9067
+ className: "codexSubscriptionPreferenceHint",
9068
+ children: t("connectionHint")
9069
+ })]
9070
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
9071
+ className: "codexSubscriptionQuotaModes",
9072
+ role: "radiogroup",
9073
+ "aria-label": t("connectionTitle"),
9074
+ "aria-busy": snapshot.saving || void 0,
9075
+ children: ["sse", "websocket"].map((value) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
9076
+ className: "codexSubscriptionQuotaMode",
9077
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
9078
+ type: "radio",
9079
+ name: "codex-connection-mode",
9080
+ checked: snapshot.connectionMode === value,
9081
+ disabled: !snapshot.writable,
9082
+ onChange: () => {
9083
+ preference.set({ connectionMode: value });
9084
+ }
9085
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: value === "sse" ? "SSE" : "WebSocket" })]
9086
+ }, value))
8945
9087
  })]
8946
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8947
- className: "codexSubscriptionQuotaModes",
8948
- role: "radiogroup",
8949
- "aria-label": t("connectionTitle"),
8950
- "aria-busy": snapshot.saving || void 0,
8951
- children: ["sse", "websocket"].map((value) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
8952
- className: "codexSubscriptionQuotaMode",
8953
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
8954
- type: "radio",
8955
- name: "codex-connection-mode",
8956
- checked: snapshot.connectionMode === value,
8957
- disabled: !snapshot.writable,
8958
- onChange: () => {
8959
- preference.set({ connectionMode: value });
8960
- }
8961
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: value === "sse" ? "SSE" : "WebSocket" })]
8962
- }, value))
8963
- })]
8964
- })
9088
+ }),
9089
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "codexSubscriptionDivider" }),
9090
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StreamIdleTimeoutPreference, {
9091
+ preference,
9092
+ t
9093
+ })
9094
+ ]
8965
9095
  }),
8966
9096
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("section", {
8967
9097
  className: "codexSubscriptionCard codexSubscriptionPreferencesCard",
package/lib/index.js CHANGED
@@ -211,6 +211,22 @@ const OUTPUT_VERBOSITY_DEFAULT = "default";
211
211
  const OUTPUT_VERBOSITY_MEDIUM = "medium";
212
212
  const OUTPUT_VERBOSITY_HIGH = "high";
213
213
  const DEFAULT_OUTPUT_VERBOSITY = OUTPUT_VERBOSITY_DEFAULT;
214
+ const INPUT_IMAGE_DETAIL_FIELD = "inputImageDetail";
215
+ const INPUT_IMAGE_DETAILS = Object.freeze([
216
+ "low",
217
+ "high",
218
+ "original",
219
+ "auto"
220
+ ]);
221
+ const DEFAULT_INPUT_IMAGE_DETAIL = "auto";
222
+ const STREAM_IDLE_TIMEOUT_MINUTES_FIELD = "streamIdleTimeoutMinutes";
223
+ const STREAM_IDLE_TIMEOUT_MINUTES = Object.freeze([
224
+ 2,
225
+ 5,
226
+ 10,
227
+ 20,
228
+ 30
229
+ ]);
214
230
  const CONTEXT_MODE_FIELD = "contextMode";
215
231
  const CONTEXT_MODE_STANDARD = "standard";
216
232
  const CONTEXT_MODE_EXTENDED = "extended";
@@ -248,6 +264,8 @@ const normalizeOutputVerbosity = (value) => [
248
264
  "medium",
249
265
  "high"
250
266
  ].includes(value) ? value : DEFAULT_OUTPUT_VERBOSITY;
267
+ const normalizeInputImageDetail = (value) => INPUT_IMAGE_DETAILS.includes(value) ? value : DEFAULT_INPUT_IMAGE_DETAIL;
268
+ const normalizeStreamIdleTimeoutMinutes = (value) => STREAM_IDLE_TIMEOUT_MINUTES.includes(value) ? value : 10;
251
269
  const normalizeContextMode = (value) => [
252
270
  "standard",
253
271
  "extended",
@@ -358,6 +376,16 @@ const PREFERENCE_FIELDS = Object.freeze({
358
376
  default: DEFAULT_OUTPUT_VERBOSITY,
359
377
  error: "Invalid output verbosity preference"
360
378
  },
379
+ [INPUT_IMAGE_DETAIL_FIELD]: {
380
+ choices: INPUT_IMAGE_DETAILS,
381
+ default: DEFAULT_INPUT_IMAGE_DETAIL,
382
+ error: "Invalid input image detail preference"
383
+ },
384
+ [STREAM_IDLE_TIMEOUT_MINUTES_FIELD]: {
385
+ choices: STREAM_IDLE_TIMEOUT_MINUTES,
386
+ default: 10,
387
+ error: "Invalid stream idle timeout preference"
388
+ },
361
389
  [CONTEXT_MODE_FIELD]: {
362
390
  choices: [
363
391
  CONTEXT_MODE_STANDARD,
@@ -1164,7 +1192,8 @@ const SUPPORTED_RUNTIME_VERSIONS = Object.freeze([
1164
1192
  "0.1.5-rc.2",
1165
1193
  "0.1.5-rc.3",
1166
1194
  "0.1.7-rc.1",
1167
- "0.1.7-rc.2"
1195
+ "0.1.7-rc.2",
1196
+ "0.2.0-rc.1"
1168
1197
  ]);
1169
1198
  const require = createRequire(import.meta.url);
1170
1199
  const execute = promisify(execFile);
@@ -2812,6 +2841,34 @@ function normalizeTransportEvent(event, signal) {
2812
2841
  //#endregion
2813
2842
  //#region src/pi-ai-runtime.js
2814
2843
  const FAST_SERVICE_TIER = "priority";
2844
+ /** Apply the chosen detail to user and tool-result images after the provider assembles the request. */
2845
+ function withInputImageDetail(payload, detail) {
2846
+ if (!Array.isArray(payload.input)) return payload;
2847
+ let changed = false;
2848
+ const input = payload.input.map((item) => {
2849
+ const field = Array.isArray(item?.content) ? "content" : ["function_call_output", "custom_tool_call_output"].includes(item?.type) && Array.isArray(item.output) ? "output" : void 0;
2850
+ if (field === void 0) return item;
2851
+ let itemChanged = false;
2852
+ const parts = item[field].map((part) => {
2853
+ if (part?.type !== "input_image" || part.detail === detail) return part;
2854
+ itemChanged = true;
2855
+ return {
2856
+ ...part,
2857
+ detail
2858
+ };
2859
+ });
2860
+ if (!itemChanged) return item;
2861
+ changed = true;
2862
+ return {
2863
+ ...item,
2864
+ [field]: parts
2865
+ };
2866
+ });
2867
+ return changed ? {
2868
+ ...payload,
2869
+ input
2870
+ } : payload;
2871
+ }
2815
2872
  /**
2816
2873
  * Preserve pi-ai's native Codex OAuth provider while allowing DSH's generic
2817
2874
  * PiAiAdapter to pass the access token resolved by the host credential store.
@@ -2824,7 +2881,7 @@ const FAST_SERVICE_TIER = "priority";
2824
2881
  * persistence, headers, transport, and model behavior remain owned by the
2825
2882
  * original provider.
2826
2883
  */
2827
- function openaiCodexSubscriptionProvider({ resolveSpeedMode = () => void 0, resolveOutputVerbosity = () => OUTPUT_VERBOSITY_DEFAULT, resolveContextMode = () => void 0, resolveCustomContextWindow = () => void 0, catalog, connection, compaction, runNetwork = (_area, operation) => operation() } = {}) {
2884
+ function openaiCodexSubscriptionProvider({ resolveSpeedMode = () => void 0, resolveOutputVerbosity = () => OUTPUT_VERBOSITY_DEFAULT, resolveInputImageDetail = () => void 0, resolveContextMode = () => void 0, resolveCustomContextWindow = () => void 0, catalog, connection, compaction, runNetwork = (_area, operation) => operation() } = {}) {
2828
2885
  const provider = createOpenAICodexProvider();
2829
2886
  const requestToken = Object.freeze({
2830
2887
  name: "DSH-managed Codex OAuth request token",
@@ -2844,6 +2901,7 @@ function openaiCodexSubscriptionProvider({ resolveSpeedMode = () => void 0, reso
2844
2901
  const requestedVerbosity = resolveOutputVerbosity();
2845
2902
  const textVerbosity = supportsVerbosity(model) ? requestedVerbosity === "default" ? metadata?.defaultVerbosity ?? "medium" : requestedVerbosity : void 0;
2846
2903
  const fast = resolveSpeedMode() === "fast" && (metadata?.supportsFast ?? supportsCodexFastMode(model?.id));
2904
+ const inputImageDetail = normalizeInputImageDetail(resolveInputImageDetail());
2847
2905
  const onPayload = options.onPayload;
2848
2906
  return {
2849
2907
  ...options,
@@ -2860,10 +2918,11 @@ function openaiCodexSubscriptionProvider({ resolveSpeedMode = () => void 0, reso
2860
2918
  };
2861
2919
  const managed = compaction?.preparePayload(preferred, model?.contextWindow) ?? preferred;
2862
2920
  const next = await onPayload?.(managed, requestModel);
2921
+ const detailed = inputImageDetail === "auto" ? next ?? managed : withInputImageDetail(next ?? managed, inputImageDetail);
2863
2922
  return {
2864
- ...next ?? managed,
2923
+ ...detailed,
2865
2924
  ...textVerbosity === void 0 ? {} : { text: {
2866
- ...(next ?? managed).text ?? {},
2925
+ ...detailed.text ?? {},
2867
2926
  verbosity: textVerbosity
2868
2927
  } },
2869
2928
  ...fast ? { service_tier: FAST_SERVICE_TIER } : {}
@@ -2951,7 +3010,7 @@ async function readSubscriptionCredentials(getAuth, readCredential, signal) {
2951
3010
  }
2952
3011
  //#endregion
2953
3012
  //#region src/version.js
2954
- const PACKAGE_VERSION = "2.2.4";
3013
+ const PACKAGE_VERSION = "2.2.5";
2955
3014
  const USER_AGENT = `dsh-codex-subscription/${PACKAGE_VERSION}`;
2956
3015
  //#endregion
2957
3016
  //#region src/model-catalog.js
@@ -5890,6 +5949,7 @@ function apply(ctx, config = {}) {
5890
5949
  compaction,
5891
5950
  resolveSpeedMode: () => settings.get()[SPEED_MODE_FIELD],
5892
5951
  resolveOutputVerbosity: () => normalizeOutputVerbosity(settings.get()[OUTPUT_VERBOSITY_FIELD]),
5952
+ resolveInputImageDetail: () => settings.get()[INPUT_IMAGE_DETAIL_FIELD],
5893
5953
  resolveContextMode: () => normalizeContextMode(settings.get()[CONTEXT_MODE_FIELD]),
5894
5954
  resolveCustomContextWindow: (modelKey) => {
5895
5955
  const overrides = readCapabilitySettings(settings.get())[CUSTOM_CONTEXT_OVERRIDES_FIELD];
@@ -5914,6 +5974,8 @@ function apply(ctx, config = {}) {
5914
5974
  [SEARCH_PROVIDER_FIELD]: settings.get()[SEARCH_PROVIDER_FIELD],
5915
5975
  [SPEED_MODE_FIELD]: settings.get()[SPEED_MODE_FIELD],
5916
5976
  [OUTPUT_VERBOSITY_FIELD]: normalizeOutputVerbosity(settings.get()[OUTPUT_VERBOSITY_FIELD]),
5977
+ [INPUT_IMAGE_DETAIL_FIELD]: normalizeInputImageDetail(settings.get()[INPUT_IMAGE_DETAIL_FIELD]),
5978
+ [STREAM_IDLE_TIMEOUT_MINUTES_FIELD]: normalizeStreamIdleTimeoutMinutes(settings.get()[STREAM_IDLE_TIMEOUT_MINUTES_FIELD]),
5917
5979
  [CONTEXT_MODE_FIELD]: normalizeContextMode(settings.get()[CONTEXT_MODE_FIELD]),
5918
5980
  [CUSTOM_CONTEXT_WINDOW_FIELD]: normalizeCustomContextWindow(settings.get()[CUSTOM_CONTEXT_WINDOW_FIELD]),
5919
5981
  ...Object.fromEntries(Object.entries(CUSTOM_CONTEXT_MODEL_FIELDS).map(([modelKey, field]) => [field, normalizeCustomContextWindow(settings.get()[field] ?? CUSTOM_CONTEXT_MODEL_DEFAULTS[modelKey], CUSTOM_CONTEXT_MODEL_CAPS[modelKey])])),
@@ -5941,7 +6003,6 @@ function apply(ctx, config = {}) {
5941
6003
  piProvider: provider,
5942
6004
  configuredMaxTokens: /* @__PURE__ */ new Map(),
5943
6005
  modelErrors: /* @__PURE__ */ new Map(),
5944
- streamIdleTimeoutMs: 600 * 1e3,
5945
6006
  maxRequestImageBytes: MAX_REQUEST_IMAGE_BYTES,
5946
6007
  requestImagePixelBudget: REQUEST_IMAGE_PIXEL_BUDGET,
5947
6008
  requestImageMaxBytes: REQUEST_IMAGE_MAX_BYTES,
@@ -5951,15 +6012,21 @@ function apply(ctx, config = {}) {
5951
6012
  let profileKey;
5952
6013
  let profileSnapshot;
5953
6014
  const profiles = () => {
6015
+ const preferences = settings.get();
6016
+ const streamIdleTimeoutMinutes = normalizeStreamIdleTimeoutMinutes(preferences[STREAM_IDLE_TIMEOUT_MINUTES_FIELD]);
5954
6017
  const key = JSON.stringify([
5955
6018
  modelCatalog.revision(),
5956
- normalizeContextMode(settings.get()[CONTEXT_MODE_FIELD]),
5957
- settings.get()[CUSTOM_CONTEXT_OVERRIDES_FIELD],
5958
- ...Object.values(CUSTOM_CONTEXT_MODEL_FIELDS).map((field) => settings.get()[field])
6019
+ streamIdleTimeoutMinutes,
6020
+ normalizeContextMode(preferences[CONTEXT_MODE_FIELD]),
6021
+ preferences[CUSTOM_CONTEXT_OVERRIDES_FIELD],
6022
+ ...Object.values(CUSTOM_CONTEXT_MODEL_FIELDS).map((field) => preferences[field])
5959
6023
  ]);
5960
6024
  if (key !== profileKey) {
5961
6025
  profileKey = key;
5962
- profileSnapshot = /* @__PURE__ */ new Map([[PROVIDER, profile]]);
6026
+ profileSnapshot = /* @__PURE__ */ new Map([[PROVIDER, Object.freeze({
6027
+ ...profile,
6028
+ streamIdleTimeoutMs: streamIdleTimeoutMinutes * 60 * 1e3
6029
+ })]]);
5963
6030
  }
5964
6031
  return profileSnapshot;
5965
6032
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-codex-subscription",
3
- "version": "2.2.4",
3
+ "version": "2.2.5",
4
4
  "description": "Use ChatGPT and Codex subscriptions in DeepSeek Harness with OAuth, quota, safe resets, web search, images, and Fast mode",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -77,46 +77,46 @@
77
77
  },
78
78
  "peerDependencies": {
79
79
  "@deepseek-ai/cordis": "4.0.1 || 4.0.2 || 4.0.3 || 4.0.4",
80
- "@deepseek-ai/dsh-api-remotes": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2",
81
- "@deepseek-ai/dsh-client-connection": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2",
82
- "@deepseek-ai/dsh-client-locale": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2",
83
- "@deepseek-ai/dsh-client-ui-conversation": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2",
84
- "@deepseek-ai/dsh-client-ui-model-selection": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2",
85
- "@deepseek-ai/dsh-client-ui-primitives": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2",
86
- "@deepseek-ai/dsh-client-ui-settings": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2",
87
- "@deepseek-ai/dsh-client-ui-slots": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2",
88
- "@deepseek-ai/dsh-client-ui-tool": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2",
89
- "@deepseek-ai/dsh-credentials": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2",
90
- "@deepseek-ai/dsh-llm": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2",
91
- "@deepseek-ai/dsh-llm-pi-ai": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2",
92
- "@deepseek-ai/dsh-settings": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2",
93
- "@deepseek-ai/dsh-tools": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2",
94
- "@deepseek-ai/dsh-web": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2",
80
+ "@deepseek-ai/dsh-api-remotes": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
81
+ "@deepseek-ai/dsh-client-connection": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
82
+ "@deepseek-ai/dsh-client-locale": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
83
+ "@deepseek-ai/dsh-client-ui-conversation": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
84
+ "@deepseek-ai/dsh-client-ui-model-selection": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
85
+ "@deepseek-ai/dsh-client-ui-primitives": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
86
+ "@deepseek-ai/dsh-client-ui-settings": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
87
+ "@deepseek-ai/dsh-client-ui-slots": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
88
+ "@deepseek-ai/dsh-client-ui-tool": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
89
+ "@deepseek-ai/dsh-credentials": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
90
+ "@deepseek-ai/dsh-llm": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
91
+ "@deepseek-ai/dsh-llm-pi-ai": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
92
+ "@deepseek-ai/dsh-settings": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
93
+ "@deepseek-ai/dsh-tools": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
94
+ "@deepseek-ai/dsh-web": "0.1.2-rc.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.6-alpha.1 || 0.1.6-alpha.2 || 0.1.7-alpha.1 || 0.1.7-alpha.2 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1",
95
95
  "@deepseek-ai/schemastery": "3.18.1 || ^3.18.2",
96
96
  "@earendil-works/pi-ai": "0.82.1 || 0.85.1",
97
97
  "react": "^18.2.0",
98
98
  "react-dom": "^18.2.0",
99
- "@deepseek-ai/dsh-subagent-codex": "0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2"
99
+ "@deepseek-ai/dsh-subagent-codex": "0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1"
100
100
  },
101
101
  "devDependencies": {
102
102
  "@deepseek-ai/cordis": "4.0.4",
103
- "@deepseek-ai/dsh-api-remotes": "0.1.7-rc.2",
104
- "@deepseek-ai/dsh-client-connection": "0.1.7-rc.2",
105
- "@deepseek-ai/dsh-client-locale": "0.1.7-rc.2",
106
- "@deepseek-ai/dsh-client-ui-conversation": "0.1.7-rc.2",
107
- "@deepseek-ai/dsh-client-ui-model-selection": "0.1.7-rc.2",
108
- "@deepseek-ai/dsh-client-ui-primitives": "0.1.7-rc.2",
109
- "@deepseek-ai/dsh-client-ui-settings": "0.1.7-rc.2",
110
- "@deepseek-ai/dsh-client-ui-slots": "0.1.7-rc.2",
111
- "@deepseek-ai/dsh-client-ui-tool": "0.1.7-rc.2",
112
- "@deepseek-ai/dsh-credentials": "0.1.7-rc.2",
113
- "@deepseek-ai/dsh-invariants": "0.1.7-rc.2",
114
- "@deepseek-ai/dsh-llm": "0.1.7-rc.2",
115
- "@deepseek-ai/dsh-llm-pi-ai": "0.1.7-rc.2",
116
- "@deepseek-ai/dsh-session": "0.1.7-rc.2",
117
- "@deepseek-ai/dsh-settings": "0.1.7-rc.2",
118
- "@deepseek-ai/dsh-tools": "0.1.7-rc.2",
119
- "@deepseek-ai/dsh-web": "0.1.7-rc.2",
103
+ "@deepseek-ai/dsh-api-remotes": "0.2.0-rc.1",
104
+ "@deepseek-ai/dsh-client-connection": "0.2.0-rc.1",
105
+ "@deepseek-ai/dsh-client-locale": "0.2.0-rc.1",
106
+ "@deepseek-ai/dsh-client-ui-conversation": "0.2.0-rc.1",
107
+ "@deepseek-ai/dsh-client-ui-model-selection": "0.2.0-rc.1",
108
+ "@deepseek-ai/dsh-client-ui-primitives": "0.2.0-rc.1",
109
+ "@deepseek-ai/dsh-client-ui-settings": "0.2.0-rc.1",
110
+ "@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.1",
111
+ "@deepseek-ai/dsh-client-ui-tool": "0.2.0-rc.1",
112
+ "@deepseek-ai/dsh-credentials": "0.2.0-rc.1",
113
+ "@deepseek-ai/dsh-invariants": "0.2.0-rc.1",
114
+ "@deepseek-ai/dsh-llm": "0.2.0-rc.1",
115
+ "@deepseek-ai/dsh-llm-pi-ai": "0.2.0-rc.1",
116
+ "@deepseek-ai/dsh-session": "0.2.0-rc.1",
117
+ "@deepseek-ai/dsh-settings": "0.2.0-rc.1",
118
+ "@deepseek-ai/dsh-tools": "0.2.0-rc.1",
119
+ "@deepseek-ai/dsh-web": "0.2.0-rc.1",
120
120
  "@deepseek-ai/schemastery": "3.18.4",
121
121
  "@earendil-works/pi-ai": "0.85.1",
122
122
  "@heroicons/react": "2.2.0",
@@ -125,10 +125,10 @@
125
125
  "react": "18.3.1",
126
126
  "react-dom": "18.3.1",
127
127
  "tsdown": "0.22.2",
128
- "@deepseek-ai/dsh-subagent-codex": "0.1.7-rc.2"
128
+ "@deepseek-ai/dsh-subagent-codex": "0.2.0-rc.1"
129
129
  },
130
130
  "dependencies": {
131
- "@deepseek-ai/dsh-home-paths": "0.1.7-rc.2",
131
+ "@deepseek-ai/dsh-home-paths": "0.2.0-rc.1",
132
132
  "https-proxy-agent": "7.0.6",
133
133
  "ws": "8.21.3"
134
134
  },