@toddzheng024/dscode-desktop 0.7.35 → 0.7.36

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
@@ -3,7 +3,7 @@
3
3
  DSCODE adds a coding preset, browser workflows, cross-session collaboration,
4
4
  memory and task management to the official DeepSeek Harness Desktop application.
5
5
 
6
- **Version:** 0.7.35 · **Harness runtime:** 0.2.0-rc.2
6
+ **Version:** 0.7.36 · **Harness runtime:** 0.2.0-rc.2
7
7
 
8
8
  Preview release candidate; publication is a separate step.
9
9
 
@@ -48,7 +48,7 @@ public release; a candidate build alone does not publish a package.
48
48
  ## Install a published version
49
49
 
50
50
  After this version is available on npm, enter
51
- `@toddzheng024/dscode-desktop@0.7.35` in **Plugins → Add plugin**,
51
+ `@toddzheng024/dscode-desktop@0.7.36` in **Plugins → Add plugin**,
52
52
  review the installation, install, then choose **Enable now**. Using the exact
53
53
  version keeps the installation tied to these instructions and compatibility
54
54
  requirements. The `preview` tag tracks the current Desktop preview release.
package/docs/CHANGELOG.md CHANGED
@@ -6,6 +6,15 @@ Per-release notes live in [`docs/releases/`](releases/); the entries below summa
6
6
 
7
7
  <!-- Add upcoming changes under Unreleased. -->
8
8
 
9
+ ## [0.7.36] - 2026-10-09
10
+
11
+ ### Added
12
+
13
+ - `dscode acp` serves standard ACP stdio clients with the DSCODE agent preset and configured providers. It supports native DSH session controls and forwards approval requests to the client. See [ACP clients](acp.md) for setup and inherited protocol limitations.
14
+
15
+ - The source and npm launchers preserve ACP stdin/stdout, use client tool approvals, and require an installed-protocol probe before Hub publication.
16
+ - Linux CI pulls the official Node image through its ECR Public mirror to avoid Docker Hub anonymous pull limits.
17
+
9
18
  ## [0.7.35] - 2026-10-08
10
19
 
11
20
  - Promote the verified Desktop package to both `preview` and `latest` so default installations receive this fix instead of 0.7.33. Promotion requires a matching public-install receipt.
package/docs/acp.md ADDED
@@ -0,0 +1,31 @@
1
+ # ACP clients
2
+
3
+ Run `dscode acp` to expose the DSCODE agent preset through Agent Client Protocol over newline-delimited JSON-RPC on stdin/stdout. The terminal interface is disabled. The ACP client supplies an absolute workspace directory when creating a session; tools run on the computer running DSCODE.
4
+
5
+ ## Connect a client
6
+
7
+ Configure your client's custom ACP agent with executable `dscode` and arguments `["acp"]`. If the editor cannot find commands installed through nvm, use the absolute path printed by `command -v dscode`. Keep stdin open for the lifetime of the connection.
8
+
9
+ To select an initial model explicitly, use:
10
+
11
+ ```sh
12
+ dscode acp --model custom-your-provider-id/your-model-id
13
+ ```
14
+
15
+ Without `--model`, the bridge uses DSCODE's saved default provider and model. Set up credentials and custom services in the normal TUI first with `/login` or `/provider custom`. The stable custom provider ID is recorded in `~/.dscode/providers.yaml`; it is not the service's display name. API keys stay in the existing credential store. Clients supporting ACP configuration options can select an advertised model and reasoning effort after creating a session.
16
+
17
+ For a source checkout, the equivalent executable is `node` with arguments `["/absolute/path/to/dscode/bin/dscode.mjs", "acp"]`. Source and npm installations use their existing, separate state directories. `--patch FILE` adds a trusted composition overlay and can be repeated. `dscode acp --help` prints usage without starting the runtime or installing a profile.
18
+
19
+ ## Behavior and limits
20
+
21
+ - New and resumed ACP agents mount the `dscode` preset, including its tools and provider adapters. The bridge reuses DSH's native ACP implementation rather than translating terminal output.
22
+ - ACP sessions use the `ask` permission preset. Tool requests requiring approval are sent to the ACP client; the client can allow once, reject, or cancel. Normal sandbox rules still apply. The terminal's automatic model review is not the approval decision maker for these sessions.
23
+ - Standard session creation, prompts, cancellation, model configuration, listing, resume, close and MCP attachment are inherited from the pinned DSH bridge. Resume reconnects a session without replaying its transcript.
24
+ - The inherited bridge identifies itself as `deepseek-harness-acp`. It does not advertise `session/load`, modes, slash commands, terminal delegation, client filesystem operations or interactive question forms. Clients requiring those features need additional integration; a successful protocol handshake does not establish full editor compatibility.
25
+ - Title generation, session-card generation and memory generation are disabled in this transport. Configured providers, tools and other integrations remain available; ACP is not an offline mode.
26
+ - Stdout is reserved for protocol frames. First-install progress and launcher diagnostics go to stderr. Trusted custom patches must also respect this rule.
27
+ - Closing stdin shuts down the runtime. SIGTERM is forwarded by the launcher. Sessions persist in the same installation's state directory, and a running ACP process holds the normal installation lock against upgrades.
28
+
29
+ ## Verification
30
+
31
+ `node scripts/verify-acp.mjs` exercises the source CLI with a fixture model and custom API, without paid model requests. Unit tests cover argument validation, preset composition, source and npm launcher routing, cleanup and signal forwarding. Client-specific UI behavior must be verified in the intended editor.
@@ -0,0 +1,14 @@
1
+ # DSCODE 0.7.36
2
+
3
+ This release exposes the DSCODE agent preset to ACP clients through the source and npm launchers.
4
+
5
+ - **ACP entry point:** `dscode acp` runs DSH's native stdio bridge with DSCODE tools and provider adapters. It uses the saved model selection or `--model PROVIDER/ID`; configure credentials and custom services in the terminal interface first. Configure clients with executable `dscode` and arguments `["acp"]`. See the [ACP guide](../acp.md) for setup.
6
+ - **Client approvals and session lifecycle:** ACP sessions use the `ask` permission preset and send approval requests to the client. Creation, prompts, cancellation, model configuration, listing, resume, close and MCP attachment inherit the pinned native bridge. Stdout carries protocol frames, terminal-only generation is disabled, and closing stdin exits the runtime while preserving the installation's session state.
7
+ - **Support boundary:** the bridge retains the `deepseek-harness-acp` identity. It does not add transcript replay through `session/load`, modes, slash commands, client filesystem/terminal delegation or interactive question forms. This is a terminal-launcher transport; the Desktop plugin retains its existing support boundary.
8
+ - **Distribution checks:** the npm launcher includes its ACP routing code, the bundle includes the bridge, and Hub publication requires a successful protocol probe against the installed artifacts. Native tool-result regression cases cover all three custom API formats using upstream's serializer. Linux CI uses the official Node image's ECR Public mirror to avoid Docker Hub anonymous pull limits.
9
+
10
+ Update the global launcher with `npm install -g @toddzheng024/dscode@latest`, then run `dscode update` to refresh an existing Hub profile. A fresh installation provisions its matching profile on first use.
11
+
12
+ Verification of the merged feature code passed `npm run check` on Node 22.19.0 and 24.19.0: 1,087 unit/component tests, both TypeScript checks, 80.16% complete source line coverage, integration/package checks and 63 offline evaluation cases. Real Chrome checks and the scripted browser evaluation passed. Linux end-to-end verification passed all seven steps, including installed ACP, Hub installation, agent execution, failed upgrade and rollback; the GitHub macOS and Linux gates also passed. Documentation and lint checks run for this version change, and the release workflow requalifies the exact versioned terminal and Desktop archives before publication.
13
+
14
+ The ACP probe covers initialization, a fixture custom API, DSCODE tool calls, allow/reject approvals, cancellation, list/resume/close and EOF shutdown. Specific editor compatibility and paid model endpoints have no automated case in this release. No live-model quality claim follows from the fixture probes.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toddzheng024/dscode-desktop",
3
- "version": "0.7.35",
3
+ "version": "0.7.36",
4
4
  "private": false,
5
5
  "description": "DSCODE for Harness Desktop: coding collaboration, session memory, browser workflows and task management.",
6
6
  "license": "MIT",
@@ -0,0 +1,45 @@
1
+ export const USAGE = `Usage: dscode acp [options]
2
+ Serve Agent Client Protocol over stdio using the DSCODE agent preset.
3
+ The client supplies each session's workspace. Stdout contains only ACP frames.
4
+
5
+ Options:
6
+ --model PROVIDER/ID initial model (default: the saved default model)
7
+ --patch FILE additional composition overlay (repeatable)
8
+ -h, --help show this help
9
+
10
+ Configure credentials and custom providers in the TUI before connecting.
11
+ Permission requests are answered by the ACP client. Disconnecting exits.`;
12
+
13
+ export function parseAcpArgs(argv) {
14
+ const options = { patches: [], help: false };
15
+ for (let index = 0; index < argv.length; index++) {
16
+ const arg = argv[index];
17
+ if (arg === '--help' || arg === '-h') { options.help = true; continue; }
18
+ if (!['--model', '--patch'].includes(arg)) throw Error(`Unknown ACP option: ${arg}`);
19
+ const value = argv[++index];
20
+ if (!value || value.startsWith('-')) throw Error(`${arg} requires a value`);
21
+ if (arg === '--patch') options.patches.push(value);
22
+ else {
23
+ if (!/^[^/\s]+\/\S+$/.test(value)) throw Error('--model expects provider/model');
24
+ options.model = value;
25
+ }
26
+ }
27
+ return options;
28
+ }
29
+
30
+ export function acpOverlay(entry, options = {}) {
31
+ return `${['tui-startup', 'tui-runner', 'session-title-llm'].map(id => `- id: ${id}\n disabled: true`).join('\n')}
32
+ - id: dscode-session-cards
33
+ config:
34
+ enabled: false
35
+ - id: dscode-memory
36
+ config:
37
+ generate: false
38
+ - insert:
39
+ - id: acp-app-startup
40
+ name: '@deepseek-ai/dsh-acp-app'
41
+ - id: dscode-acp
42
+ name: ${JSON.stringify(entry)}
43
+ config: ${JSON.stringify(options.model ? { model: options.model } : {})}
44
+ `;
45
+ }
@@ -0,0 +1,44 @@
1
+ import { apply as applyAcp } from '@deepseek-ai/dsh-acp';
2
+ import z from '@deepseek-ai/schemastery';
3
+
4
+ export const name = 'dscode-acp';
5
+ export const inject = ['acpAppStartup', 'agents', 'agentPresets', 'agentDefaultModel', 'permissionPresets', 'llm', 'sessionPersistence', 'sessions', 'dscodeCustom'];
6
+ export const Config = z.object({ model: z.string() });
7
+
8
+ // Scope the factory to this bridge: TUI and delegated agents keep their own
9
+ // composition. ACP still owns model selection, MCP attachment and disposal.
10
+ export function presetAgents(ctx) {
11
+ const wrap = method => async (options) => {
12
+ const handle = await ctx.agents[method]({
13
+ ...options,
14
+ ...(method === 'create' ? { meta: { ...options.meta, agentPreset: 'dscode' } } : {}),
15
+ setup: async (agentCtx, agent) => {
16
+ await ctx.agentPresets.mount(agentCtx, 'dscode');
17
+ await options.setup?.(agentCtx, agent);
18
+ },
19
+ });
20
+ ctx.permissionPresets.set(handle.agent.session, 'ask');
21
+ return handle;
22
+ };
23
+ const overrides = { create: wrap('create'), resume: wrap('resume') };
24
+ return new Proxy(ctx.agents, {
25
+ get(target, key) {
26
+ if (Object.hasOwn(overrides, key)) return overrides[key];
27
+ const value = Reflect.get(target, key, target);
28
+ return typeof value === 'function' ? value.bind(target) : value;
29
+ },
30
+ });
31
+ }
32
+
33
+ export function startAcp(ctx, config = {}, bridge = applyAcp) {
34
+ const selection = config.model
35
+ ? { provider: config.model.slice(0, config.model.indexOf('/')), model: config.model.slice(config.model.indexOf('/') + 1) }
36
+ : ctx.agentDefaultModel.currentSelection();
37
+ const scoped = ctx.extend({ agents: presetAgents(ctx) });
38
+ bridge(scoped, { provider: selection.provider, model: selection.model });
39
+ }
40
+
41
+ export async function apply(ctx, config) {
42
+ await ctx.get('dscodeCustom').refresh();
43
+ startAcp(ctx, config);
44
+ }
@@ -58,7 +58,7 @@ const childLimit = owner => (owner.session.requestHeader?.()?.config ?? owner.op
58
58
  // repository there instead of pointing at a path that does not exist.
59
59
  const DOCS_DIR = fileURLToPath(new URL('../../docs/', import.meta.url));
60
60
  const DOCS_REPO = 'https://github.com/qiz029/dscode/blob/main/docs/';
61
- export const DOCS_SECTION = `To answer questions about DSCODE itself - what it supports, how a feature is configured, what a command does - treat the bundled user guides as the source of truth instead of guessing: ${existsSync(DOCS_DIR) ? `${DOCS_DIR} plus the repository root README.md (session-bridge.md, session-communication.md, session-cards.md, memory.md, exec.md, email.md, browser-use.md, plugin-hub.md, computer-use.md, skills.md, tui-commands.md, session-metrics.md, dscode-ultra.md, auto-review.md, account-login.md, opencode-go.md, custom-providers.md, demo.md, triggers.md)` : `the repository documentation at ${DOCS_REPO} plus the root README.md (session-bridge.md, session-communication.md, session-cards.md, memory.md, exec.md, email.md, browser-use.md, plugin-hub.md, computer-use.md, skills.md, tui-commands.md, session-metrics.md, dscode-ultra.md, auto-review.md, account-login.md, opencode-go.md, custom-providers.md, demo.md, triggers.md)`}. Read the relevant guide before answering rather than relying on memory of an earlier session. docs/CONTEXT-HANDOFF.md, docs/session-messaging-design.md, docs/cloud-webapp-host.md, docs/triggers-design.md, docs/verification.md, docs/maintainability.md and docs/vendored-tui-upgrade.md are internal development records, not user documentation: never quote them to a user or treat them as a specification. When the guides do not cover something, describe only what the running installation actually does and say plainly that it is not documented.`;
61
+ export const DOCS_SECTION = `To answer questions about DSCODE itself - what it supports, how a feature is configured, what a command does - treat the bundled user guides as the source of truth instead of guessing: ${existsSync(DOCS_DIR) ? `${DOCS_DIR} plus the repository root README.md (session-bridge.md, session-communication.md, session-cards.md, memory.md, exec.md, acp.md, email.md, browser-use.md, plugin-hub.md, computer-use.md, skills.md, tui-commands.md, session-metrics.md, dscode-ultra.md, auto-review.md, account-login.md, opencode-go.md, custom-providers.md, demo.md, triggers.md)` : `the repository documentation at ${DOCS_REPO} plus the root README.md (session-bridge.md, session-communication.md, session-cards.md, memory.md, exec.md, acp.md, email.md, browser-use.md, plugin-hub.md, computer-use.md, skills.md, tui-commands.md, session-metrics.md, dscode-ultra.md, auto-review.md, account-login.md, opencode-go.md, custom-providers.md, demo.md, triggers.md)`}. Read the relevant guide before answering rather than relying on memory of an earlier session. docs/CONTEXT-HANDOFF.md, docs/session-messaging-design.md, docs/cloud-webapp-host.md, docs/triggers-design.md, docs/verification.md, docs/maintainability.md and docs/vendored-tui-upgrade.md are internal development records, not user documentation: never quote them to a user or treat them as a specification. When the guides do not cover something, describe only what the running installation actually does and say plainly that it is not documented.`;
62
62
 
63
63
  export function apply(ctx, config = {}) {
64
64
  const viewer = config.desktop ? 'Delegation board in the right sidebar' : '/delegate-dashboard';