@norman-else/dsh-claude 0.1.0

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/INSTALL.md ADDED
@@ -0,0 +1,58 @@
1
+ # Agent Installation Runbook
2
+
3
+ This runbook is idempotent for a local `dsh-claude` checkout and an existing DSH `web` profile.
4
+
5
+ ## 1. Verify the checkout
6
+
7
+ ```sh
8
+ cd /path/to/dsh-claude
9
+ export PATH="/opt/homebrew/bin:$PATH"
10
+ pnpm install
11
+ pnpm check
12
+ node lib/bin.mjs doctor
13
+ ```
14
+
15
+ Stop if Doctor cannot find an authenticated local Claude Code installation. Do not request, copy, or write credentials.
16
+
17
+ ## 2. Install the managed Agent Preset
18
+
19
+ Host activation normally does this automatically. Running it explicitly is safe:
20
+
21
+ ```sh
22
+ node lib/bin.mjs install-preset
23
+ ```
24
+
25
+ Expected output is `installed` on first run or `unchanged` on later runs. A conflict is terminal until a human chooses what to do with the existing user preset.
26
+
27
+ ## 3. Link the bundle into the current Web profile
28
+
29
+ ```sh
30
+ dsh plugin --profile web add "link:$(pwd)"
31
+ ```
32
+
33
+ Do not start another DSH Web server. This bundle must load in the existing app at `http://127.0.0.1:56454`.
34
+
35
+ ## 4. Refresh and smoke test
36
+
37
+ 1. Refresh the existing DSH Web page.
38
+ 2. Confirm **Claude** appears in the new-session Agent Preset picker.
39
+ 3. Run one existing native preset prompt and verify it remains native.
40
+ 4. Create a Claude session and send a read-only prompt.
41
+ 5. Send one edit prompt; verify DSH displays a permission request. Exercise reject first, then allow once with a harmless temporary file.
42
+ 6. Cancel a running prompt and confirm the cancelled session owns no child `claude` process that is still executing cancelled work or left orphaned/unowned.
43
+ 7. Refresh the browser and continue the session.
44
+ 8. Restart DSH and confirm the next prompt resumes the persisted Claude session.
45
+
46
+ A live prompt can consume the user's Claude subscription. Keep it minimal.
47
+
48
+ ## 5. Uninstall safely
49
+
50
+ Run before removing the link:
51
+
52
+ ```sh
53
+ cd /path/to/dsh-claude
54
+ node lib/bin.mjs remove-preset
55
+ dsh plugin --profile web remove @norman-else/dsh-claude
56
+ ```
57
+
58
+ The remover refuses to delete any user-modified preset file.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 dsh-claude contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,184 @@
1
+ # dsh-claude
2
+
3
+ Run the local Claude Code CLI as a first-class main conversation inside DeepSeek Harness (DSH).
4
+
5
+ `dsh-claude` does not recreate Claude Code with an API client. It starts the user's installed `claude` executable through the official Agent SDK protocol, keeps one live process per active DSH session, and leaves Claude Code in charge of its own agent loop, tools, `CLAUDE.md`, Skills, Hooks, Plugins, MCP servers, settings, and authentication.
6
+
7
+ ## What it adds
8
+
9
+ - A `Claude` Agent Preset in the normal new-session preset picker.
10
+ - A `claude` DSH model provider with Claude Code's `default`, `opus[1m]`, `fable`, `sonnet`, and `haiku` choices.
11
+ - Long-lived Claude processes with per-session serialization, idle eviction, cancellation, and persisted Claude session resume.
12
+ - DSH approval prompts for Claude tool permission requests.
13
+ - Durable, redacted plugin-sidecar activity for thinking summaries, tool calls/results, permissions, subagents, status, usage, and errors.
14
+ - Native turn-tail activity cards and a Settings → Claude Code Doctor panel.
15
+ - A safe CLI for Doctor and managed preset install/remove.
16
+
17
+ ## Requirements
18
+
19
+ - macOS (v0.1 verification target).
20
+ - DeepSeek Harness compatible with `0.1.0-rc.5` public plugin APIs.
21
+ - A local Claude Code installation already authenticated by the user.
22
+ - Node.js 20 or later.
23
+
24
+ The plugin never manages Claude credentials. Use an already authenticated local Claude Code installation, or configure its absolute executable path in DSH.
25
+
26
+ ## Install in DSH
27
+
28
+ Install the published package into the DSH Web profile:
29
+
30
+ ```sh
31
+ dsh plugin --profile web add @norman-else/dsh-claude
32
+ ```
33
+
34
+ Wait for the Web profile to rebuild, then refresh the existing DSH page. Open a new conversation and select **Claude** from the Agent Preset picker.
35
+
36
+ The Host plugin automatically installs a two-file managed preset at:
37
+
38
+ ```text
39
+ $DSH_HOME/.agent-presets/claude/
40
+ ```
41
+
42
+ It writes only absent files. If that preset id already contains different content, activation fails rather than overwriting user work.
43
+
44
+ ## Use
45
+
46
+ 1. Open a new DSH conversation.
47
+ 2. Choose **Claude** in the Agent Preset picker.
48
+ 3. Choose **Default (recommended)**, **Opus (1M context)**, **Fable**, **Sonnet**, or **Haiku**.
49
+ 4. Send a normal text prompt.
50
+ 5. Answer Claude tool permissions through the existing DSH approval UI.
51
+ 6. Expand **Claude Code activity** beneath a completed assistant turn to inspect the redacted execution trail.
52
+
53
+ Native DSH presets remain available and keep the native DSH agent loop.
54
+
55
+ ### Current input boundary
56
+
57
+ v0.1 forwards only the newest direct human text in a DSH step. It intentionally ignores the DSH system prompt, DSH tool schemas, and injected plugin messages because Claude Code owns those surfaces. Image-only prompts are rejected with an actionable error.
58
+
59
+ ## Permission and sandbox boundary
60
+
61
+ Claude Code runs in its normal local configuration and can read/write `~/.claude` so that authentication, settings, plugins, and session recovery continue to work.
62
+
63
+ Every Claude permission callback is bridged to `ctx.approval.request(...)`:
64
+
65
+ - `allowed-once` is the only granting result.
66
+ - reject, cancel, missing answerer, and audit failure all deny the action.
67
+ - DSH `never` approval policy therefore fails closed.
68
+ - DSH access modes map to Claude permission modes: `read-only` → `plan`, `workspace-write` → `acceptEdits`, and explicitly acknowledged `danger-full-access` → `bypassPermissions`.
69
+
70
+ This is a permission-policy bridge, not kernel-level workspace confinement. DSH `0.1.0-rc.5` exposes one writable sandbox root, while full Claude compatibility also requires writable `~/.claude`. The plugin therefore does **not** claim that paths outside the workspace are technically unwritable. It still uses DSH managed subprocess ownership for explicit argv, credential-shaped environment scrubbing, cancellation, and whole-process-tree termination.
71
+
72
+ ## Process and recovery behavior
73
+
74
+ - One live streaming-input Claude query per active DSH session.
75
+ - One active top-level turn at a time per session.
76
+ - Default maximum: 4 live Claude processes.
77
+ - Default idle eviction: 30 minutes.
78
+ - The Claude session id and redacted presentation metadata are persisted in a plugin-owned sidecar under `$DSH_HOME/plugins/dsh-claude/sessions`; new DSH logs contain no `claude-code/*` events.
79
+ - After normal eviction or DSH restart, the next prompt resumes that Claude session.
80
+ - A crash after visible Claude/tool activity is reported as **outcome unknown**. The plugin never automatically replays that prompt because its side effects may already have happened.
81
+ - Cancelling a DSH turn interrupts Claude and tears down that session's process entry (bounded interrupt, then close/abort/terminate/join); the next prompt re-establishes the process from the persisted Claude session id. Plugin unload and agent disposal also terminate the owned process tree.
82
+ - DSH outer model retries are disabled for this provider.
83
+
84
+ ## Doctor
85
+
86
+ Inside DSH, open **Settings → Claude Code** and run Doctor.
87
+
88
+ From the checkout:
89
+
90
+ ```sh
91
+ node lib/bin.mjs doctor
92
+ node lib/bin.mjs doctor --executable /absolute/path/to/claude
93
+ ```
94
+
95
+ Doctor reports only the resolved executable, version, coarse authentication category/method/provider/subscription, handshake state, configured limits, and process count. It never returns tokens, email, organization id, settings content, or environment secrets.
96
+
97
+ Executable resolution order:
98
+
99
+ 1. configured absolute path
100
+ 2. `claude` on DSH's scrubbed PATH
101
+ 3. `~/.local/bin/claude`
102
+ 4. `/opt/homebrew/bin/claude`
103
+ 5. `/usr/local/bin/claude`
104
+
105
+ To configure a nonstandard path, edit the plugin row in the Web profile composition:
106
+
107
+ ```yaml
108
+ - id: llm-claude
109
+ name: dsh-claude
110
+ config:
111
+ executablePath: /absolute/path/to/claude
112
+ model: default
113
+ idleTimeoutMs: 1800000
114
+ maxProcesses: 4
115
+ ```
116
+
117
+ ## Development
118
+
119
+ ```sh
120
+ git clone https://github.com/Norman-else/dsh-claude.git
121
+ cd dsh-claude
122
+ export PATH="/opt/homebrew/bin:$PATH"
123
+ pnpm install
124
+ pnpm check
125
+ ```
126
+
127
+ To test this source checkout in DSH without publishing it:
128
+
129
+ ```sh
130
+ dsh plugin --profile web add "link:$(pwd)"
131
+ ```
132
+
133
+ To inspect the package that would be published:
134
+
135
+ ```sh
136
+ pnpm pack --pack-destination ./dist-pack
137
+ ```
138
+
139
+ The project uses fixture/state-machine tests and a minimal SDK-level handshake probe (a tool-disabled, one-turn `query()` against the resolved local executable). Full DSH-linked live acceptance (native coexistence, Claude turn, permission allow/deny, cancel, resume, orphan-process check) is run after the Host restart per `INSTALL.md`. The Agent SDK is pinned to `0.3.233`; runtime execution is forced to the resolved local Claude executable through `pathToClaudeCodeExecutable`.
140
+
141
+ ## Uninstall
142
+
143
+ Remove the managed preset while this package is still present:
144
+
145
+ ```sh
146
+ node lib/bin.mjs remove-preset
147
+ ```
148
+
149
+ Then remove the package from the Web profile:
150
+
151
+ ```sh
152
+ dsh plugin --profile web remove @norman-else/dsh-claude
153
+ ```
154
+
155
+ The preset remover deletes only files whose contents exactly match the package-managed copies. It refuses to delete modified content.
156
+
157
+ ## Troubleshooting
158
+
159
+ ### Claude preset appears broken
160
+
161
+ Run `node lib/bin.mjs install-preset`. If it reports a conflict, move or rename the existing `$DSH_HOME/.agent-presets/claude` directory; the plugin will not overwrite it.
162
+
163
+ ### Executable is missing
164
+
165
+ Run Doctor and set an absolute `executablePath`. GUI application PATH often omits `~/.local/bin`.
166
+
167
+ ### Claude is signed out
168
+
169
+ Run the supported local flow directly:
170
+
171
+ ```sh
172
+ /absolute/path/to/claude auth login
173
+ ```
174
+
175
+ DSH does not proxy login or store credentials.
176
+
177
+ ### A turn says “outcome unknown”
178
+
179
+ Inspect the activity record and workspace before sending a new instruction. Do not repeat a potentially side-effecting prompt blindly.
180
+
181
+ ## Architecture records
182
+
183
+ - Product and architecture spec: `docs/aegis/spec/2026-08-15-dsh-claude-spec.md`
184
+ - Implementation plan: `docs/aegis/plan/2026-08-15-dsh-claude-implementation-plan.md`
@@ -0,0 +1,5 @@
1
+ # dsh-claude host bundle. The plugin registers the local Claude Code bridge
2
+ # and installs the small managed Agent Preset into the DSH user preset root.
3
+ - insert:
4
+ - id: llm-claude
5
+ name: dsh-claude
package/lib/bin.d.mts ADDED
@@ -0,0 +1 @@
1
+ export {}
package/lib/bin.mjs ADDED
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env node
2
+ import { n as removeManagedPreset, r as parseClaudeVersion, t as ensureManagedPreset } from "./preset-installer-DUVN1J6P.mjs";
3
+ import { access } from "node:fs/promises";
4
+ import { delimiter, isAbsolute, join } from "node:path";
5
+ import { homedir } from "node:os";
6
+ import { scrubbedParentEnv } from "@deepseek-ai/dsh-subprocess";
7
+ import { constants } from "node:fs";
8
+ import { spawnSync } from "node:child_process";
9
+ //#region src/bin.ts
10
+ function option(name) {
11
+ const index = process.argv.indexOf(name);
12
+ return index < 0 ? void 0 : process.argv[index + 1];
13
+ }
14
+ async function executable(configured) {
15
+ const candidates = [];
16
+ if (configured !== void 0) candidates.push(configured);
17
+ else {
18
+ for (const directory of (process.env.PATH ?? "").split(delimiter)) if (directory.length > 0) candidates.push(join(directory, "claude"));
19
+ candidates.push(join(homedir(), ".local", "bin", "claude"), "/opt/homebrew/bin/claude", "/usr/local/bin/claude");
20
+ }
21
+ for (const candidate of [...new Set(candidates)]) {
22
+ if (!isAbsolute(candidate)) continue;
23
+ try {
24
+ await access(candidate, constants.X_OK);
25
+ return candidate;
26
+ } catch {}
27
+ }
28
+ }
29
+ function run(executablePath, args) {
30
+ return spawnSync(executablePath, args, {
31
+ encoding: "utf8",
32
+ env: scrubbedParentEnv(),
33
+ timeout: 15e3,
34
+ windowsHide: true
35
+ });
36
+ }
37
+ async function doctor() {
38
+ const configured = option("--executable") ?? process.env.DSH_CLAUDE_CODE_EXECUTABLE;
39
+ const path = await executable(configured);
40
+ if (path === void 0) {
41
+ process.stdout.write(`${JSON.stringify({
42
+ executable: {
43
+ status: "missing",
44
+ searched: configured === void 0 ? [
45
+ "claude",
46
+ "~/.local/bin/claude",
47
+ "/opt/homebrew/bin/claude",
48
+ "/usr/local/bin/claude"
49
+ ] : [configured]
50
+ },
51
+ version: { status: "not-run" },
52
+ authentication: { status: "not-run" },
53
+ message: "Set executablePath to an absolute Claude Code CLI path"
54
+ }, null, 2)}\n`);
55
+ return 1;
56
+ }
57
+ const versionProbe = run(path, ["--version"]);
58
+ const version = parseClaudeVersion(`${versionProbe.stdout ?? ""}\n${versionProbe.stderr ?? ""}`);
59
+ const authProbe = run(path, [
60
+ "auth",
61
+ "status",
62
+ "--json"
63
+ ]);
64
+ let authentication = { status: "unknown" };
65
+ if (authProbe.status === 0) try {
66
+ const value = JSON.parse(authProbe.stdout);
67
+ authentication = {
68
+ status: value.loggedIn === true ? "signed-in" : "signed-out",
69
+ ...typeof value.authMethod === "string" ? { method: value.authMethod } : {},
70
+ ...typeof value.apiProvider === "string" ? { provider: value.apiProvider } : {},
71
+ ...typeof value.subscriptionType === "string" ? { subscription: value.subscriptionType } : {}
72
+ };
73
+ } catch {
74
+ authentication = {
75
+ status: "unknown",
76
+ message: "Authentication status was not valid JSON"
77
+ };
78
+ }
79
+ process.stdout.write(`${JSON.stringify({
80
+ executable: {
81
+ status: "found",
82
+ path
83
+ },
84
+ version: version === void 0 ? { status: "error" } : {
85
+ status: "ok",
86
+ value: version
87
+ },
88
+ authentication,
89
+ handshake: "not-run"
90
+ }, null, 2)}\n`);
91
+ return version === void 0 ? 1 : 0;
92
+ }
93
+ async function main() {
94
+ const command = process.argv[2] ?? "doctor";
95
+ if (command === "doctor") return doctor();
96
+ if (command === "install-preset") {
97
+ process.stdout.write(`${await ensureManagedPreset()}\n`);
98
+ return 0;
99
+ }
100
+ if (command === "remove-preset") {
101
+ process.stdout.write(`${await removeManagedPreset()}\n`);
102
+ return 0;
103
+ }
104
+ process.stderr.write(`Usage: dsh-claude [doctor [--executable PATH] | install-preset | remove-preset]\n`);
105
+ return 2;
106
+ }
107
+ try {
108
+ process.exitCode = await main();
109
+ } catch (error) {
110
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
111
+ process.exitCode = 1;
112
+ }
113
+ //#endregion
114
+ export {};
115
+
116
+ //# sourceMappingURL=bin.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.mjs","names":[],"sources":["../src/bin.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { access } from 'node:fs/promises'\nimport { constants } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { delimiter, isAbsolute, join } from 'node:path'\nimport { spawnSync } from 'node:child_process'\nimport { scrubbedParentEnv } from '@deepseek-ai/dsh-subprocess'\nimport { parseClaudeVersion } from './executable.ts'\nimport { ensureManagedPreset, removeManagedPreset } from './preset-installer.ts'\n\nfunction option(name: string): string | undefined {\n const index = process.argv.indexOf(name)\n return index < 0 ? undefined : process.argv[index + 1]\n}\n\nasync function executable(configured?: string): Promise<string | undefined> {\n const candidates: string[] = []\n if (configured !== undefined) candidates.push(configured)\n else {\n for (const directory of (process.env.PATH ?? '').split(delimiter)) {\n if (directory.length > 0) candidates.push(join(directory, 'claude'))\n }\n candidates.push(join(homedir(), '.local', 'bin', 'claude'), '/opt/homebrew/bin/claude', '/usr/local/bin/claude')\n }\n for (const candidate of [...new Set(candidates)]) {\n if (!isAbsolute(candidate)) continue\n try {\n await access(candidate, constants.X_OK)\n return candidate\n } catch {\n // Continue to the next documented candidate.\n }\n }\n return undefined\n}\n\nfunction run(executablePath: string, args: string[]) {\n return spawnSync(executablePath, args, {\n encoding: 'utf8',\n env: scrubbedParentEnv(),\n timeout: 15_000,\n windowsHide: true,\n })\n}\n\nasync function doctor(): Promise<number> {\n const configured = option('--executable') ?? process.env.DSH_CLAUDE_CODE_EXECUTABLE\n const path = await executable(configured)\n if (path === undefined) {\n process.stdout.write(`${JSON.stringify({\n executable: { status: 'missing', searched: configured === undefined ? ['claude', '~/.local/bin/claude', '/opt/homebrew/bin/claude', '/usr/local/bin/claude'] : [configured] },\n version: { status: 'not-run' },\n authentication: { status: 'not-run' },\n message: 'Set executablePath to an absolute Claude Code CLI path',\n }, null, 2)}\\n`)\n return 1\n }\n const versionProbe = run(path, ['--version'])\n const version = parseClaudeVersion(`${versionProbe.stdout ?? ''}\\n${versionProbe.stderr ?? ''}`)\n const authProbe = run(path, ['auth', 'status', '--json'])\n let authentication: Record<string, unknown> = { status: 'unknown' }\n if (authProbe.status === 0) {\n try {\n const value = JSON.parse(authProbe.stdout) as Record<string, unknown>\n authentication = {\n status: value.loggedIn === true ? 'signed-in' : 'signed-out',\n ...(typeof value.authMethod === 'string' ? { method: value.authMethod } : {}),\n ...(typeof value.apiProvider === 'string' ? { provider: value.apiProvider } : {}),\n ...(typeof value.subscriptionType === 'string' ? { subscription: value.subscriptionType } : {}),\n }\n } catch {\n authentication = { status: 'unknown', message: 'Authentication status was not valid JSON' }\n }\n }\n process.stdout.write(`${JSON.stringify({\n executable: { status: 'found', path },\n version: version === undefined ? { status: 'error' } : { status: 'ok', value: version },\n authentication,\n handshake: 'not-run',\n }, null, 2)}\\n`)\n return version === undefined ? 1 : 0\n}\n\nasync function main(): Promise<number> {\n const command = process.argv[2] ?? 'doctor'\n if (command === 'doctor') return doctor()\n if (command === 'install-preset') {\n process.stdout.write(`${await ensureManagedPreset()}\\n`)\n return 0\n }\n if (command === 'remove-preset') {\n process.stdout.write(`${await removeManagedPreset()}\\n`)\n return 0\n }\n process.stderr.write(`Usage: dsh-claude [doctor [--executable PATH] | install-preset | remove-preset]\\n`)\n return 2\n}\n\ntry {\n process.exitCode = await main()\n} catch (error) {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`)\n process.exitCode = 1\n}\n"],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ window.__ModuleLoader__.load({
2
+ id: "dsh-claude",
3
+ factory: (require) => {
4
+ var module = { exports: {} };
5
+ var exports = module.exports;
6
+ var { ClientContext } = require("@deepseek-ai/dsh-client-runtime/client");
7
+ //#region src/client/locales.d.ts
8
+ declare const en: {
9
+ readonly nav: "Claude Code";
10
+ readonly title: "Claude Code";
11
+ readonly description: "DSH uses the local Claude Code and preserves its agent loop, tools, CLAUDE.md, Skills, Hooks, and MCP configuration.";
12
+ readonly activity: "Claude Code activity";
13
+ readonly detail: "Show redacted detail";
14
+ readonly thinking: "Think";
15
+ readonly running: "Running";
16
+ readonly failed: "Failed";
17
+ readonly done: "Done";
18
+ readonly subagent: "Subagent";
19
+ readonly tokens: "{count} tokens";
20
+ readonly doctor: "Run Doctor";
21
+ readonly refreshing: "Running Doctor…";
22
+ readonly executable: "Executable";
23
+ readonly version: "Version";
24
+ readonly authentication: "Authentication";
25
+ readonly handshake: "Protocol handshake";
26
+ readonly processes: "Live processes";
27
+ readonly limits: "Process limits";
28
+ readonly processSummary: "{total} total · {active} active";
29
+ readonly limitSummary: "{max} max · {minutes} min idle";
30
+ readonly missing: "Not found";
31
+ readonly unknown: "Unknown";
32
+ readonly error: "Doctor failed";
33
+ readonly security: "Permission boundary";
34
+ readonly securityBody: "Claude tool permissions are decided through the DSH approval UI. This version does not claim kernel-level write isolation for ~/.claude or paths outside the workspace.";
35
+ readonly tasks: "Tasks";
36
+ readonly tasksPanel: "Background tasks";
37
+ readonly tasksEmpty: "No subagents or background tasks";
38
+ readonly tasksOpen: "Show background tasks";
39
+ readonly tasksClose: "Close tasks panel";
40
+ readonly tasksRunning: "Running";
41
+ readonly tasksNoneRunning: "No tasks are running";
42
+ readonly tasksSettled: "Finished";
43
+ readonly tasksClear: "Clear";
44
+ readonly tasksViewActivity: "View activity";
45
+ readonly tasksHideActivity: "Hide activity";
46
+ readonly tasksRunningCount: "{count} running task(s)";
47
+ readonly tasksToolUses: "{count} tool use(s)";
48
+ readonly tasksCompleted: "Completed";
49
+ readonly tasksFailed: "Failed";
50
+ readonly tasksStopped: "Stopped";
51
+ readonly tasksKilled: "Killed";
52
+ readonly tasksBackground: "Background";
53
+ readonly tasksLastTool: "Last tool {tool}";
54
+ };
55
+ type ClaudeCodeSettingsKey = keyof typeof en;
56
+ //#endregion
57
+ //#region src/client/index.d.ts
58
+ /** The right-side details column slot declared by dsh-client-ui-layout
59
+ * (kind 'single', scope 'session'). Merged locally because this package does
60
+ * not depend on the layout package's client types. */
61
+ declare module '@deepseek-ai/dsh-client-ui-slots' {
62
+ interface SlotMap {
63
+ details: {
64
+ kind: 'single';
65
+ scope: 'session';
66
+ };
67
+ }
68
+ }
69
+ declare module '@deepseek-ai/dsh-client-ui-slots' {
70
+ interface LocaleNamespaceMap {
71
+ 'settings.claude-code': ClaudeCodeSettingsKey;
72
+ }
73
+ }
74
+ declare const name = "dsh-claude-client";
75
+ declare const inject: string[];
76
+ declare function apply(ctx: ClientContext): void;
77
+ //#endregion
78
+ module.exports.apply = apply;
79
+ module.exports.inject = inject;
80
+ module.exports.name = name;
81
+ return module.exports;
82
+ }
83
+ });
84
+ //# sourceMappingURL=client.d.ts.map