dsh-packycode-api 1.1.5 → 1.1.7

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,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.1.7
4
+
5
+ - Fixed HTTP 405 from the settings RPC after a first hot install. The shipped Connection getter retains its own row's context, which need not inject `webServer`; the browser channel now registers with this plugin's `connection` / `webServer` injection scope as its explicit owner. Native Connection admission, authentication and RPC envelopes remain in use. The explicit-owner entry is internal to the shipped service, so other Connection implementations retain the public `rpc.handle` contract.
6
+ - Removed the bundle override of the protected `connection` row. First installation now mounts the plugin's own channel without rebuilding that row or restarting DSH; unloading or losing the optional webserver scope removes the channel. Installation instructions now describe the restart-free first install.
7
+ - Added real Connection / Cordis HTTP regressions for the 0.1.5 and 0.2.0-rc.2 hosts, covering first install, authenticated settings access, uninstall/reinstall and optional webserver availability. The 0.2 test host uses a separate development fixture with matching host dependencies.
8
+ - Validation: 284 tests passed, both bundles rebuilt and the tarball generated. The six HTTP lifecycle/authentication checks also passed against the built host bundle, without restarting the fixture's existing server or Connection service.
9
+
10
+ ## 1.1.6
11
+
12
+ - Fixed the missing `image` input capability on `deepseek-flash`, following [DeepSeek's official vision guide](https://api-docs.deepseek.com/guides/vision/). DSH can now send image attachments through the existing Chat Completions route. Audited the two GPT models, Grok 4.7 and three Claude models against their vendor documentation; all six already declare image input.
13
+ - Added a regression that sends an image through the registered host route and checks the actual Chat Completions `image_url` payload. `scripts/live-check.mjs --with-vision` also checks DeepSeek's answers to two color fixtures without revealing the colors in the prompt.
14
+ - Validation: 278 offline tests, both rebuilt bundles and the versioned tarball. The built route passed all four HTTP model checks, key rotation and secret-free RPC projections. DeepSeek correctly identified both 512×512 red and blue PNGs through the attachment service seam.
15
+
3
16
  ## 1.1.5
4
17
 
5
18
  - Added `grok-4.7`, displayed as **Grok 4.7**, to the PackyCode `openai-responses` route at `https://cf.api.fan/v1`. [The official Grok 4.7 guide](https://docs.x.ai/developers/grok-4-7) declares a 500,000-token context, text/image input, text output, and `low` / `medium` / `high` / `xhigh` reasoning (default `high`, no off or max). There is no separate documented text-output cap; the numeric pi-ai ceiling is 500,000, bounded by remaining context per request. Only GPT Responses requests keep `prompt_cache_key`: the gateway's Grok route rejects this field with a misleading `Incorrect API key provided` error. Non-GPT Responses requests use pi-ai's `cacheRetention: 'none'` to omit it; the model, protocol, effort and plugin-owned credential stay the same.
package/README.en.md CHANGED
@@ -45,9 +45,9 @@ Open the desktop application's **Plugins** page, click **Add plugin**, and enter
45
45
  dsh-packycode-api
46
46
  ```
47
47
 
48
- Choose the **official** install source, then click **Install**. To pin a version, enter `dsh-packycode-api@1.1.5`.
48
+ Choose the **official** install source, then click **Install**. To pin a version, enter `dsh-packycode-api@1.1.7`.
49
49
 
50
- Then **manually restart the desktop application**. Refreshing the page does not reload the plugin inside the Host process.
50
+ A **first install requires no DSH restart**: open **Settings → PackyCode** and add a key immediately. When updating an already loaded older version, follow the restart guidance in the **Plugin version** card.
51
51
 
52
52
  ### 2. Add a key
53
53
 
@@ -64,7 +64,7 @@ Choose a model from the `PackyCode` group. `deepseek-flash`, `gpt-6.1-sol`, `gpt
64
64
 
65
65
  The **Plugins** page shows the installed state and version, and is also where you enable, disable, or uninstall.
66
66
 
67
- **For non-desktop profiles only:** `dsh plugin --profile <name> add dsh-packycode-api@1.1.5`. Do not use it for `desktop` — the CLI refuses it (`profile "desktop" is managed exclusively by the Electron application`).
67
+ **For non-desktop profiles only:** `dsh plugin --profile <name> add dsh-packycode-api@1.1.7`. Do not use it for `desktop` — the CLI refuses it (`profile "desktop" is managed exclusively by the Electron application`).
68
68
 
69
69
  A local checkout can be linked with `dsh plugin --profile <name> add link:/path/to/dsh-packycode-api`.
70
70
 
@@ -138,7 +138,7 @@ Claude Code CLI → temporary local MCP web_search → selected PackyCode DeepSe
138
138
 
139
139
  | Model | How it runs | Effort | Token group |
140
140
  | --- | --- | --- | --- |
141
- | `deepseek-flash` | HTTP, chat/completions | Can be off; `low` / `high` / `max` | `deepseek-officially`, `deepseek-sale` |
141
+ | `deepseek-flash` | HTTP, chat/completions, images allowed | Can be off; `low` / `high` / `max` | `deepseek-officially`, `deepseek-sale` |
142
142
  | `gpt-6.1-sol` | HTTP, Responses, images allowed | Cannot be off; `low` / `medium` / `high` / `xhigh` / `max` | `codex`, `codex-sale` |
143
143
  | `gpt-6-astra` | Same | Same | Same |
144
144
  | `grok-4.7` (Grok 4.7) | HTTP, Responses, text/image input; 500K context | Cannot be off; `low` / `medium` / `high` / `xhigh` | The Grok coverage read from the gateway in Settings |
@@ -148,6 +148,8 @@ Claude Code CLI → temporary local MCP web_search → selected PackyCode DeepSe
148
148
 
149
149
  A model in the list does not mean the current token group allows it. When changing groups, do not drop the group that serves the model you still want.
150
150
 
151
+ All seven models in the current catalog declare text and image input. DeepSeek Flash follows the [official vision guide](https://api-docs.deepseek.com/guides/vision/); images are read through DSH's attachment service and sent with the Chat Completions request.
152
+
151
153
  Grok 4.7's context and reasoning levels follow the [official guide](https://docs.x.ai/developers/grok-4-7). There is no separate text-output limit; the plugin uses the context size as its numeric output ceiling, bounded by the remaining context per request.
152
154
 
153
155
  Only GPT Responses requests keep `prompt_cache_key`; other Responses models omit it by default. This gateway's Grok route reports a misleading `Incorrect API key provided` error when the field is present.
package/README.md CHANGED
@@ -49,9 +49,9 @@
49
49
  dsh-packycode-api
50
50
  ```
51
51
 
52
- 在**安装源**中选择**官方源**,然后点击**安装**。需要固定版本时填入 `dsh-packycode-api@1.1.5`。
52
+ 在**安装源**中选择**官方源**,然后点击**安装**。需要固定版本时填入 `dsh-packycode-api@1.1.7`。
53
53
 
54
- 完成后**手动重启桌面应用**。仅刷新页面不会重新加载 Host 里的插件。
54
+ 首次安装后**无需重启 DSH**,可直接打开**设置 → PackyCode** 添加 Key。更新已加载的旧版时,按「插件版本」卡片的重启提示操作。
55
55
 
56
56
  ### 2. 添加 Key
57
57
 
@@ -68,7 +68,7 @@ dsh-packycode-api
68
68
 
69
69
  桌面应用的**插件**页可以看到已安装状态与版本,也可以在那里启用、停用或卸载。
70
70
 
71
- **仅用于非 desktop profile:** `dsh plugin --profile <name> add dsh-packycode-api@1.1.5`。不要对 `desktop` 使用它 —— CLI 会直接拒绝(`profile "desktop" is managed exclusively by the Electron application`)。
71
+ **仅用于非 desktop profile:** `dsh plugin --profile <name> add dsh-packycode-api@1.1.7`。不要对 `desktop` 使用它 —— CLI 会直接拒绝(`profile "desktop" is managed exclusively by the Electron application`)。
72
72
 
73
73
  本地开发可以用绝对路径:`dsh plugin --profile <name> add link:/path/to/dsh-packycode-api`。
74
74
 
@@ -142,7 +142,7 @@ Claude Code CLI → 本机临时 MCP web_search → 插件选定的 DeepSeek/GPT
142
142
 
143
143
  | 模型 | 怎么调用 | 推理档位 | 适合的令牌分组 |
144
144
  | --- | --- | --- | --- |
145
- | `deepseek-flash` | HTTP,chat/completions | 可关;`low` / `high` / `max` | `deepseek-officially`、`deepseek-sale` |
145
+ | `deepseek-flash` | HTTP,chat/completions,可带图 | 可关;`low` / `high` / `max` | `deepseek-officially`、`deepseek-sale` |
146
146
  | `gpt-6.1-sol` | HTTP,Responses,可带图 | 不能关;`low` / `medium` / `high` / `xhigh` / `max` | `codex`、`codex-sale` |
147
147
  | `gpt-6-astra` | 同上 | 同上 | 同上 |
148
148
  | `grok-4.7`(Grok 4.7) | HTTP,Responses,可带图;500k 上下文 | 不能关;`low` / `medium` / `high` / `xhigh` | 以设置页从网关读取的 Grok 分组覆盖为准 |
@@ -152,6 +152,8 @@ Claude Code CLI → 本机临时 MCP web_search → 插件选定的 DeepSeek/GPT
152
152
 
153
153
  列表里看得到模型,不代表当前令牌分组一定放行。换分组时不要把对应分组一起去掉。
154
154
 
155
+ 当前目录中的 7 个模型都声明了文字和图像输入。DeepSeek Flash 的识图能力按 [官方图像理解文档](https://api-docs.deepseek.com/zh-cn/guides/vision/) 配置;图片通过 DSH 附件服务读取,再随 chat/completions 请求发送。
156
+
155
157
  Grok 4.7 的上下文与推理档位来自 [官方文档](https://docs.x.ai/developers/grok-4-7)。官方没有单独限制文字输出长度;插件将输出上限设为上下文大小,并按每次请求的剩余上下文收紧。
156
158
 
157
159
  Responses 请求只有 GPT 模型保留 `prompt_cache_key`,其他 Responses 模型默认省略。当前网关的 Grok 路由会将这个字段误报成 `Incorrect API key provided`。
package/cordis.patch.yml CHANGED
@@ -5,19 +5,3 @@
5
5
  - insert:
6
6
  - id: packycode-api
7
7
  name: 'dsh-packycode-api'
8
-
9
- # Connection registers a plugin's RPC channel through `owner.webServer`, where
10
- # the owner is the Connection row's own fiber — not the caller's. The shipped
11
- # dsh-web-app row injects `webRuntime` alone, so that read is refused with
12
- # `cannot get property "webServer" without inject`, the channel never reaches
13
- # the web server, and the browser's calls answer HTTP 405 while the boot log
14
- # stays clean.
15
- #
16
- # An entry patch replaces the whole inject list, so name every service that
17
- # fiber actually touches: `credentials` is the module's own inject, `webRuntime`
18
- # carries the row's `trustedHosts: !!js ctx.webRuntime.trustedHosts`, and
19
- # `webServer` is what channel registration reads. The name guard leaves a
20
- # replacement Connection implementation untouched.
21
- - id: connection
22
- name: '@deepseek-ai/dsh-client-connection'
23
- inject: [credentials, webRuntime, webServer]
package/lib/index.js CHANGED
@@ -600,7 +600,7 @@ const PACKYCODE_MODELS = Object.freeze([
600
600
  provider: PROVIDER,
601
601
  baseUrl: COMPLETIONS_BASE,
602
602
  reasoning: true,
603
- input: Object.freeze(["text"]),
603
+ input: Object.freeze(["text", "image"]),
604
604
  cost: NO_COST,
605
605
  contextWindow: 1e6,
606
606
  maxTokens: 384e3,
@@ -6915,15 +6915,16 @@ function apply(ctx, config) {
6915
6915
  modelSelection
6916
6916
  });
6917
6917
  /**
6918
- * Connection registers a channel through `owner.webServer`, read on its own
6919
- * row's fiber — which is why this plugin ships the `connection` inject patch
6920
- * in `cordis.patch.yml`. Without that service the read is refused, the
6921
- * channel never reaches the web server, and the browser answers HTTP 405
6922
- * while the boot log stays clean. A profile with neither service (a headless
6923
- * run) simply never runs this callback.
6918
+ * The shipped Connection getter retains its own service context, whose row
6919
+ * need not inject webServer. Register with our injected context explicitly:
6920
+ * a first hot install then mounts the channel without rebuilding Connection.
6921
+ * The native registry still owns admission and the wire protocol. Its
6922
+ * explicit-owner entry is internal, so retain the public RPC contract for
6923
+ * other Connection implementations. A headless profile can omit this scope.
6924
6924
  */
6925
6925
  ctx.inject(["connection", "webServer"], (connectionCtx) => {
6926
- ctx.effect(() => connectionCtx.connection.rpc.handle(CHANNEL, handler), "packycode-api: loopback account RPC");
6926
+ const service = connectionCtx.connection;
6927
+ connectionCtx.effect(() => typeof service.register === "function" ? service.register(connectionCtx, CHANNEL, handler) : service.rpc.handle(CHANNEL, handler), "packycode-api: loopback account RPC");
6927
6928
  });
6928
6929
  ctx.inject(["tools"], (toolsCtx) => {
6929
6930
  ctx.effect(() => toolsCtx.tools.register(createClaudeCodeTool({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-packycode-api",
3
- "version": "1.1.5",
3
+ "version": "1.1.7",
4
4
  "description": "Use a PackyCode (PackyAPI) API key in DeepSeek Harness through a built-in multi-protocol model route with key rotation and balance display",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -82,13 +82,18 @@
82
82
  },
83
83
  "devDependencies": {
84
84
  "@deepseek-ai/cordis": "4.0.2",
85
+ "@deepseek-ai/dsh-brand": "0.1.5-rc.3",
86
+ "@deepseek-ai/dsh-client-connection": "0.1.5-rc.3",
85
87
  "@deepseek-ai/dsh-credentials": "0.1.5-rc.2",
88
+ "@deepseek-ai/dsh-invariants": "0.1.5-rc.3",
86
89
  "@deepseek-ai/dsh-llm": "0.1.5-rc.2",
87
90
  "@deepseek-ai/dsh-llm-pi-ai": "0.1.5-rc.2",
91
+ "@deepseek-ai/dsh-scope": "0.1.5-rc.3",
88
92
  "@deepseek-ai/dsh-settings": "0.1.5-rc.2",
89
93
  "@deepseek-ai/dsh-tools": "0.1.5-rc.2",
90
94
  "@deepseek-ai/schemastery": "3.18.4",
91
95
  "@earendil-works/pi-ai": "0.85.1",
96
+ "packycode-host-v020-fixture": "file:tests/fixtures/host-v020",
92
97
  "react": "18.3.1",
93
98
  "tsdown": "0.22.2",
94
99
  "yaml": "2.9.1"