@xiaoso/dsh-tool-plus 0.1.13 → 0.1.14-beta.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/README.en.md CHANGED
@@ -3,13 +3,21 @@
3
3
  <img width="240" src="assets/wordmark.png" alt="dsh tool plus">
4
4
  </div>
5
5
 
6
+ <div align="center">
7
+
6
8
  [简体中文](./README.md) | English
7
9
 
10
+ </div>
11
+
12
+ <div align="center">
13
+
8
14
  [![npm version](https://img.shields.io/npm/v/@xiaoso/dsh-tool-plus?logo=npm)](https://www.npmjs.com/package/@xiaoso/dsh-tool-plus)
9
15
  [![License: MIT](https://img.shields.io/github/license/xiaoso456/dsh-tool-plus)](LICENSE)
10
16
  [![Node](https://img.shields.io/badge/node-%3E%3D22.19%20%7C%20%3E%3D24-339933?logo=nodedotjs)](https://nodejs.org)
11
17
  [![Platform](https://img.shields.io/badge/platform-windows%20%7C%20macos%20%7C%20linux-lightgrey)]()
12
18
 
19
+ </div>
20
+
13
21
  Essential tools enhancement for DeepSeek Harness: persistent bash, structured read, multi-mode edit, atomic write, full-text search, and direct image reading — one plugin covers it all. Ported from the [Oh My Pi](https://github.com/can1357/oh-my-pi) core; once installed it automatically takes over the official bash / pwsh / file / search tools, with optional `ast_grep` / `ast_edit` structural search and rewrite.
14
22
 
15
23
  ## Features
package/README.md CHANGED
@@ -3,13 +3,21 @@
3
3
  <img width="240" src="assets/wordmark.png" alt="dsh tool plus">
4
4
  </div>
5
5
 
6
+ <div align="center">
7
+
6
8
  简体中文 | [English](./README.en.md)
7
9
 
10
+ </div>
11
+
12
+ <div align="center">
13
+
8
14
  [![npm version](https://img.shields.io/npm/v/@xiaoso/dsh-tool-plus?logo=npm)](https://www.npmjs.com/package/@xiaoso/dsh-tool-plus)
9
15
  [![License: MIT](https://img.shields.io/github/license/xiaoso456/dsh-tool-plus)](LICENSE)
10
16
  [![Node](https://img.shields.io/badge/node-%3E%3D22.19%20%7C%20%3E%3D24-339933?logo=nodedotjs)](https://nodejs.org)
11
17
  [![Platform](https://img.shields.io/badge/platform-windows%20%7C%20macos%20%7C%20linux-lightgrey)]()
12
18
 
19
+ </div>
20
+
13
21
  DeepSeek Harness 基础工具增强:持久 bash、结构化 read、多模式 edit、原子 write、全文搜索、图像直读,一个插件全覆盖。基于 [Oh My Pi](https://github.com/can1357/oh-my-pi) 内核移植,安装后自动接管官方 bash / pwsh / 文件 / 搜索工具,另有可选的 `ast_grep` / `ast_edit` 结构化搜索与重写。
14
22
 
15
23
  ## 功能特性
@@ -90,7 +98,7 @@ dsh plugin --profile web add link:<本仓库路径>
90
98
  - **dsh CLI**:需全局安装,`npm i -g @deepseek-ai/dsh`
91
99
  - **Node.js** ≥ 22.19 或 ≥ 24
92
100
  - **Git Bash**(推荐):Windows 上作为 bash 执行环境
93
- - 适用于 DeepSeek Harness `dsh` v0.2.0-rc.2(pre-release,接口可能变动)
101
+ - 适用于 DeepSeek Harness `dsh` v0.2.1-rc.1(pre-release,接口可能变动)
94
102
 
95
103
  ## 注意事项
96
104
 
package/lib/client.js CHANGED
@@ -3710,6 +3710,7 @@ window.__ModuleLoader__.load({
3710
3710
  "search.collapseAria": "收起结果",
3711
3711
  "search.expandAria": "展开其余 {count} 行结果",
3712
3712
  "search.expandRest": "… 其余 {count} 行",
3713
+ "terminal.commandLine": "命令第 {n} 行",
3713
3714
  "terminal.signal": "信号 {signal}",
3714
3715
  "terminal.exitCode": "退出码 {code}",
3715
3716
  "terminal.running": "运行中",
@@ -3778,6 +3779,7 @@ window.__ModuleLoader__.load({
3778
3779
  "search.collapseAria": "Collapse results",
3779
3780
  "search.expandAria": "Expand {count} more result lines",
3780
3781
  "search.expandRest": "… {count} more lines",
3782
+ "terminal.commandLine": "Command line {n}",
3781
3783
  "terminal.signal": "signal {signal}",
3782
3784
  "terminal.exitCode": "exit code {code}",
3783
3785
  "terminal.running": "Running",
@@ -4154,6 +4156,7 @@ window.__ModuleLoader__.load({
4154
4156
  /** Bind the card dictionary to the terminal primitive's chrome labels. */
4155
4157
  function terminalBlockLabels(t) {
4156
4158
  return {
4159
+ commandLine: (line) => t("terminal.commandLine", { n: line }),
4157
4160
  signal: (signal) => t("terminal.signal", { signal }),
4158
4161
  exitCode: (exitCode) => t("terminal.exitCode", { code: exitCode }),
4159
4162
  noExitCode: t("terminal.noExitCode"),
@@ -4863,7 +4866,7 @@ window.__ModuleLoader__.load({
4863
4866
  title,
4864
4867
  tool: toolName,
4865
4868
  summary,
4866
- summarySuffix: `${t("astEdit.replacements", { count: meta.replacements })} · ${t("astEdit.files", { count: files })}`,
4869
+ summarySuffix: `· ${t("astEdit.replacements", { count: meta.replacements })} · ${t("astEdit.files", { count: files })}`,
4867
4870
  filePath: single,
4868
4871
  openFile,
4869
4872
  inspect,
@@ -4949,7 +4952,7 @@ window.__ModuleLoader__.load({
4949
4952
  title,
4950
4953
  tool: toolName,
4951
4954
  summary,
4952
- summarySuffix: `+${totals.added} -${totals.removed}`,
4955
+ summarySuffix: `· +${totals.added} -${totals.removed}`,
4953
4956
  filePath: single,
4954
4957
  openFile,
4955
4958
  inspect,
@@ -5448,6 +5451,26 @@ window.__ModuleLoader__.load({
5448
5451
  if (!scope.includes(";")) return displayPath(scope, cwd);
5449
5452
  return scope.split(";").map((entry) => displayPath(entry.trim(), cwd)).join("; ");
5450
5453
  }
5454
+ /** Longest scope the collapsed head shows, in characters. */
5455
+ const SCOPE_MAX = 28;
5456
+ /**
5457
+ * Bound an over-long scope to a row-sized maximum, keeping its tail and
5458
+ * starting at a path boundary.
5459
+ *
5460
+ * The fragment sits outside the summary's ellipsis and never shrinks, so an
5461
+ * unbounded target — an absolute path outside the workspace, the common case
5462
+ * in a temp tree — would consume the row and leave the subject at `exp…`. The
5463
+ * tail is the end worth keeping: the leaf names the tree, the drive letter and
5464
+ * the user name do not.
5465
+ * @param scope - the already workspace-shortened scope.
5466
+ * @returns the scope, or its tail behind a leading ellipsis.
5467
+ */
5468
+ function clipScope(scope) {
5469
+ if (scope.length <= SCOPE_MAX) return scope;
5470
+ const tail = scope.slice(scope.length - SCOPE_MAX + 1);
5471
+ const boundary = tail.search(/[\\/]/);
5472
+ return boundary <= 0 ? `…${tail}` : `…${tail.slice(boundary)}`;
5473
+ }
5451
5474
  /**
5452
5475
  * The search card's collapsed trailing fragment: the scope the call searched,
5453
5476
  * then what the search found.
@@ -5461,7 +5484,7 @@ window.__ModuleLoader__.load({
5461
5484
  const facts = [];
5462
5485
  if (meta.shape === "matches") {
5463
5486
  const scope = argText(args, "path");
5464
- if (scope !== null) facts.push(t("search.scope", { path: displayScope(scope, cwd) }));
5487
+ if (scope !== null) facts.push(t("search.scope", { path: clipScope(displayScope(scope, cwd)) }));
5465
5488
  }
5466
5489
  if (meta.total === 0) facts.push(t("search.noResults"));
5467
5490
  else if (meta.shape === "matches") {
@@ -5694,7 +5717,7 @@ window.__ModuleLoader__.load({
5694
5717
  title,
5695
5718
  tool: toolName,
5696
5719
  summary: displayPath(path, cwd),
5697
- summarySuffix: lines + skip,
5720
+ summarySuffix: `· ${lines + skip}`,
5698
5721
  filePath: path,
5699
5722
  openFile,
5700
5723
  inspect,
package/lib/index.mjs CHANGED
@@ -3,7 +3,7 @@ __installBunShim();
3
3
  import { n as fs_promises_shim_exports, t as exists } from "./fs-promises-shim-B2YFWkcd.mjs";
4
4
  import { i as setRuntimeLogger, n as systemChromiumCandidatesForTest, r as runtimeLogger } from "./launch-BIWNyrBB.mjs";
5
5
  import { $ as isEnoent, A as formatCount, C as warn, D as installBunShim, F as $flag, N as $env, O as formatAge, P as $envpos, Q as hasFsCode, U as getAutoQaDbPath, V as VERSION, X as getRemoteDir, Y as getPuppeteerDir, at as findOnPath, b as debug, c as combineSignals, d as $which, et as isEnotdir, it as untilAborted, k as formatBytes$1, l as exec, m as readImageMetadata, nt as peekFile, q as getInstallId, tt as isProbablyBinary, u as render, x as error } from "./src-AELUUb5U.mjs";
6
- import { C as truncateToWidth$1, S as replaceTabs, _ as formatCodeFrameLine, a as fetchBinary, b as LRUCache, c as getParallelExtractContent, d as convertFileWithMarkit, f as Settings, g as capParseErrors, h as OMP_DEFAULTS, i as convertWithMarkit, l as ensureTool, m as settings, o as extractWithParallel, p as isSettingsInitialized, s as findParallelApiKey, u as CONVERTIBLE_EXTENSIONS, v as formatParseErrors, x as padding, y as shortenPath } from "./utils-K20t8hos.mjs";
6
+ import { C as truncateToWidth$1, S as replaceTabs, _ as formatCodeFrameLine, a as fetchBinary, b as LRUCache, c as getParallelExtractContent, d as convertFileWithMarkit, f as Settings, g as capParseErrors, h as OMP_DEFAULTS, i as convertWithMarkit, l as ensureTool, m as settings, o as extractWithParallel, p as isSettingsInitialized, s as findParallelApiKey, u as CONVERTIBLE_EXTENSIONS, v as formatParseErrors, x as padding, y as shortenPath } from "./utils-C_FVuzli.mjs";
7
7
  import { t as sanitizeText } from "./sanitize-text-BCf5KmCf.mjs";
8
8
  import { n as isRecord$5 } from "./type-guards-CttAANEx.mjs";
9
9
  import { n as ToolError, r as throwIfAborted, t as ToolAbortError } from "./tool-errors-DoyxivAR.mjs";
@@ -11479,7 +11479,7 @@ let specialHandlersPromise;
11479
11479
  * requires a special handler, so we keep them out of the cold-startup graph.
11480
11480
  */
11481
11481
  function loadSpecialHandlers() {
11482
- specialHandlersPromise ??= import("./scrapers-B8hE6oWN.mjs").then((m) => m.specialHandlers);
11482
+ specialHandlersPromise ??= import("./scrapers-bxXbHII6.mjs").then((m) => m.specialHandlers);
11483
11483
  return specialHandlersPromise;
11484
11484
  }
11485
11485
  /**
@@ -3,7 +3,7 @@ __installBunShim();
3
3
  import { n as fs_promises_shim_exports } from "./fs-promises-shim-B2YFWkcd.mjs";
4
4
  import { $ as isEnoent, B as USER_AGENT, C as warn, G as getDocsRsCacheDir, N as $env, c as combineSignals, j as formatNumber, k as formatBytes, l as exec, s as Snowflake, y as parseFrontmatter } from "./src-AELUUb5U.mjs";
5
5
  import { W as tryParseJson } from "./utils-cZX3f_Ls.mjs";
6
- import { a as fetchBinary, c as getParallelExtractContent, i as convertWithMarkit, l as ensureTool, m as settings, n as asRecord, o as extractWithParallel, r as asString, s as findParallelApiKey, t as asNumber } from "./utils-K20t8hos.mjs";
6
+ import { a as fetchBinary, c as getParallelExtractContent, i as convertWithMarkit, l as ensureTool, m as settings, n as asRecord, o as extractWithParallel, r as asString, s as findParallelApiKey, t as asNumber } from "./utils-C_FVuzli.mjs";
7
7
  import { n as isRecord } from "./type-guards-CttAANEx.mjs";
8
8
  import { r as throwIfAborted, t as ToolAbortError } from "./tool-errors-DoyxivAR.mjs";
9
9
  import { c as getLocalizedText, d as looksLikeHtml, i as decodeHtmlEntities, l as htmlToBasicMarkdown, o as formatIsoDate, r as buildResult, s as formatMediaDuration, u as loadPage } from "./types-BLrLohwK.mjs";
@@ -33,7 +33,7 @@ export interface ToolCardShellProps {
33
33
  title: string;
34
34
  /** Collapsed summary after the separator; empty renders no separator. */
35
35
  summary?: string | null | undefined;
36
- /** Trailing fragment kept outside the summary's ellipsis (e.g. `+3 -1`). */
36
+ /** Trailing fragment kept outside the summary's ellipsis; the row opens it with `· ` (e.g. `· +3 -1`). */
37
37
  summarySuffix?: string | null | undefined;
38
38
  /** Render the summary in the error tone (a failure line, not a description). */
39
39
  summaryTone?: 'default' | 'error' | undefined;
@@ -17,7 +17,7 @@
17
17
  /** Locale namespace of the tool-card bundle (registered by `registerToolCards`). */
18
18
  export declare const CARD_LOCALE_NS = "tool-plus-cards";
19
19
  /** Every copy key of the tool-card namespace. */
20
- export type ToolCardLocaleKey = 'copy' | 'copied' | 'collapse' | 'expand' | 'collapseAria' | 'expandAria' | 'expandRest' | 'files.one' | 'files.other' | 'codeBlock.title' | 'codeBlock.wrap' | 'codeBlock.unwrap' | 'running' | 'done' | 'failed' | 'stopped' | 'cancelled' | 'timedOut' | 'noOutput' | 'title.bash' | 'title.read' | 'title.write' | 'title.edit' | 'title.grep' | 'title.glob' | 'title.astGrep' | 'title.astEdit' | 'write.lines' | 'write.madeExecutable' | 'astEdit.replacements' | 'astEdit.files' | 'astEdit.parseErrors' | 'astEdit.rules' | 'astEdit.rulesRest' | 'read.window' | 'read.collapseAria' | 'read.expandAria' | 'read.expandRest' | 'search.paths' | 'search.paths.truncated' | 'search.matches' | 'search.matches.truncated' | 'search.noResults' | 'search.scope' | 'search.collapseAria' | 'search.expandAria' | 'search.expandRest' | 'terminal.signal' | 'terminal.exitCode' | 'terminal.running' | 'terminal.failed' | 'terminal.done' | 'terminal.noOutput' | 'terminal.noExitCode' | 'bash.background' | 'image.loading' | 'image.loadFailed' | 'image.open' | 'image.openNamed' | 'image.dialog' | 'image.close' | 'image.unnamed' | 'image.caption' | 'generic.params' | 'generic.noDetail' | 'inspect';
20
+ export type ToolCardLocaleKey = 'copy' | 'copied' | 'collapse' | 'expand' | 'collapseAria' | 'expandAria' | 'expandRest' | 'files.one' | 'files.other' | 'codeBlock.title' | 'codeBlock.wrap' | 'codeBlock.unwrap' | 'running' | 'done' | 'failed' | 'stopped' | 'cancelled' | 'timedOut' | 'noOutput' | 'title.bash' | 'title.read' | 'title.write' | 'title.edit' | 'title.grep' | 'title.glob' | 'title.astGrep' | 'title.astEdit' | 'write.lines' | 'write.madeExecutable' | 'astEdit.replacements' | 'astEdit.files' | 'astEdit.parseErrors' | 'astEdit.rules' | 'astEdit.rulesRest' | 'read.window' | 'read.collapseAria' | 'read.expandAria' | 'read.expandRest' | 'search.paths' | 'search.paths.truncated' | 'search.matches' | 'search.matches.truncated' | 'search.noResults' | 'search.scope' | 'search.collapseAria' | 'search.expandAria' | 'search.expandRest' | 'terminal.commandLine' | 'terminal.signal' | 'terminal.exitCode' | 'terminal.running' | 'terminal.failed' | 'terminal.done' | 'terminal.noOutput' | 'terminal.noExitCode' | 'bash.background' | 'image.loading' | 'image.loadFailed' | 'image.open' | 'image.openNamed' | 'image.dialog' | 'image.close' | 'image.unnamed' | 'image.caption' | 'generic.params' | 'generic.noDetail' | 'inspect';
21
21
  /** Simplified Chinese copy (the source dictionary). */
22
22
  export declare const zh: Record<ToolCardLocaleKey, string>;
23
23
  /** English dictionary, checked complete against the zh key set. */
@@ -18,6 +18,11 @@
18
18
  * - the count, or "no results" instead of a zero count (a zero count is what
19
19
  * the empty-state failure reads as, not what it says).
20
20
  *
21
+ * The fragment's own box never shrinks (`.twc-summarySuffix` is `flex:none`),
22
+ * so the scope it carries is bounded by {@link clipScope}: an unbounded target
23
+ * path would not clip the fragment, it would take the row and squeeze the
24
+ * subject — the pattern, the one thing the head is for — down to `exp…`.
25
+ *
21
26
  * The counting labels are the {@link searchBlockLabels} adapter the block body
22
27
  * already uses, so the head and the body say the same thing in the same words,
23
28
  * including the "showing N of M" wording of a capped payload.
@@ -6267,7 +6267,7 @@ const settings = {
6267
6267
  };
6268
6268
  //#endregion
6269
6269
  //#region package.json
6270
- var version = "0.1.13";
6270
+ var version = "0.1.14-beta.0";
6271
6271
  /** `.tmp` files older than this are treated as orphaned writes and swept. */
6272
6272
  const TMP_ORPHAN_MAX_AGE_MS = 3e5;
6273
6273
  function markitConversionCacheKey(bytes, extension) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@xiaoso/dsh-tool-plus",
3
3
  "description": "Oh My Pi bash runtime ported as a deepseek-harness tool plugin: persistent shell session, output minimizer, managed background jobs, command interception",
4
- "version": "0.1.13",
4
+ "version": "0.1.14-beta.0",
5
5
  "license": "MIT",
6
6
  "keywords": [
7
7
  "deepseek-harness",
@@ -33,7 +33,8 @@
33
33
  "tag": "latest"
34
34
  },
35
35
  "engines": {
36
- "node": "^22.19.0 || >=24.0.0"
36
+ "node": "^22.19.0 || >=24.0.0",
37
+ "dsh": ">=0.2.1-0 <0.3.0-0"
37
38
  },
38
39
  "main": "lib/index.mjs",
39
40
  "types": "lib/types/index.d.ts",
@@ -85,39 +86,38 @@
85
86
  },
86
87
  "scripts": {
87
88
  "build": "tsdown -c tsdown.config.ts && tsc -p tsconfig.json && node scripts/copy-assets.mjs",
88
- "typecheck": "tsc -p tsconfig.json --noEmit",
89
+ "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p e2e/tsconfig.json",
89
90
  "test": "vitest run --config vitest.config.ts",
90
91
  "presets:build": "node scripts/build-preset-patches.mjs",
91
92
  "presets:check": "node scripts/build-preset-patches.mjs --check",
92
93
  "e2e": "tsx tests/support/harness/dsh-e2e.ts",
93
- "e2e:web": "tsx tests/support/harness/capture-web.ts",
94
+ "e2e:browser": "e2e run --config e2e/e2e.config.ts",
94
95
  "mock:llm": "tsx tests/support/mock-openai/cli.ts",
95
96
  "postinstall": "node scripts/patch-pi-natives.mjs"
96
97
  },
97
98
  "peerDependencies": {
98
99
  "@deepseek-ai/cordis": "~4.0.4",
99
- "@deepseek-ai/dsh-agent": ">=0.2.0-0 <0.2.1-0",
100
- "@deepseek-ai/dsh-agent-preset": ">=0.2.0-0 <0.2.1-0",
101
- "@deepseek-ai/dsh-agent-preset-registry": ">=0.2.0-0 <0.2.1-0",
102
- "@deepseek-ai/dsh-attachment": ">=0.2.0-0 <0.2.1-0",
103
- "@deepseek-ai/dsh-client-connection": ">=0.2.0-0 <0.2.1-0",
104
- "@deepseek-ai/dsh-fs": ">=0.2.0-0 <0.2.1-0",
105
- "@deepseek-ai/dsh-jobs": ">=0.2.0-0 <0.2.1-0",
106
- "@deepseek-ai/dsh-llm": ">=0.2.0-0 <0.2.1-0",
107
- "@deepseek-ai/dsh-sandbox": ">=0.2.0-0 <0.2.1-0",
108
- "@deepseek-ai/dsh-session": ">=0.2.0-0 <0.2.1-0",
109
- "@deepseek-ai/dsh-settings": ">=0.2.0-0 <0.2.1-0",
110
- "@deepseek-ai/dsh-shell": ">=0.2.0-0 <0.2.1-0",
111
- "@deepseek-ai/dsh-shell-env": ">=0.2.0-0 <0.2.1-0",
112
- "@deepseek-ai/dsh-system-prompt": ">=0.2.0-0 <0.2.1-0",
113
- "@deepseek-ai/dsh-tools": ">=0.2.0-0 <0.2.1-0"
100
+ "@deepseek-ai/dsh-agent": ">=0.2.1-0 <0.3.0-0",
101
+ "@deepseek-ai/dsh-agent-preset": ">=0.2.1-0 <0.3.0-0",
102
+ "@deepseek-ai/dsh-agent-preset-registry": ">=0.2.1-0 <0.3.0-0",
103
+ "@deepseek-ai/dsh-attachment": ">=0.2.1-0 <0.3.0-0",
104
+ "@deepseek-ai/dsh-client-connection": ">=0.2.1-0 <0.3.0-0",
105
+ "@deepseek-ai/dsh-fs": ">=0.2.1-0 <0.3.0-0",
106
+ "@deepseek-ai/dsh-jobs": ">=0.2.1-0 <0.3.0-0",
107
+ "@deepseek-ai/dsh-llm": ">=0.2.1-0 <0.3.0-0",
108
+ "@deepseek-ai/dsh-sandbox": ">=0.2.1-0 <0.3.0-0",
109
+ "@deepseek-ai/dsh-session": ">=0.2.1-0 <0.3.0-0",
110
+ "@deepseek-ai/dsh-settings": ">=0.2.1-0 <0.3.0-0",
111
+ "@deepseek-ai/dsh-shell": ">=0.2.1-0 <0.3.0-0",
112
+ "@deepseek-ai/dsh-shell-env": ">=0.2.1-0 <0.3.0-0",
113
+ "@deepseek-ai/dsh-system-prompt": ">=0.2.1-0 <0.3.0-0",
114
+ "@deepseek-ai/dsh-tools": ">=0.2.1-0 <0.3.0-0"
114
115
  },
115
116
  "optionalPeerDependencies": {
116
117
  "sharp": ">=0.33"
117
118
  },
118
119
  "dependencies": {
119
- "@deepseek-ai/dsh-brand": "0.2.0-rc.2",
120
- "@deepseek-ai/dsh-invariants": "0.2.0-rc.2",
120
+ "@deepseek-ai/dsh-brand": "0.2.1-rc.1",
121
121
  "@deepseek-ai/schemastery": "~3.18.4",
122
122
  "@oh-my-pi/omptype": "18.1.17",
123
123
  "@oh-my-pi/pi-agent-core": "18.1.17",
@@ -132,42 +132,46 @@
132
132
  "yaml": "^2.9.0"
133
133
  },
134
134
  "devDependencies": {
135
+ "@ai-sdk/openai-compatible": "^3.0.67",
135
136
  "@deepseek-ai/cordis": "~4.0.4",
136
- "@deepseek-ai/dsh-agent": "0.2.0-rc.2",
137
- "@deepseek-ai/dsh-agent-preset": "0.2.0-rc.2",
138
- "@deepseek-ai/dsh-agent-preset-registry": "0.2.0-rc.2",
139
- "@deepseek-ai/dsh-api-remotes": "0.2.0-rc.2",
140
- "@deepseek-ai/dsh-api-session-controller": "0.2.0-rc.2",
141
- "@deepseek-ai/dsh-attachment": "0.2.0-rc.2",
142
- "@deepseek-ai/dsh-client-connection": "0.2.0-rc.2",
143
- "@deepseek-ai/dsh-client-locale": "0.2.0-rc.2",
144
- "@deepseek-ai/dsh-client-store": "0.2.0-rc.2",
145
- "@deepseek-ai/dsh-client-ui-chat": "0.2.0-rc.2",
146
- "@deepseek-ai/dsh-client-ui-conversation": "0.2.0-rc.2",
147
- "@deepseek-ai/dsh-client-ui-primitives": "0.2.0-rc.2",
148
- "@deepseek-ai/dsh-client-ui-renderer": "0.2.0-rc.2",
149
- "@deepseek-ai/dsh-client-ui-settings": "0.2.0-rc.2",
150
- "@deepseek-ai/dsh-client-ui-settings-plugins": "0.2.0-rc.2",
151
- "@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.2",
152
- "@deepseek-ai/dsh-client-ui-tool": "0.2.0-rc.2",
153
- "@deepseek-ai/dsh-fs": "0.2.0-rc.2",
154
- "@deepseek-ai/dsh-fs-local": "0.2.0-rc.2",
155
- "@deepseek-ai/dsh-jobs": "0.2.0-rc.2",
156
- "@deepseek-ai/dsh-jobs-local": "0.2.0-rc.2",
157
- "@deepseek-ai/dsh-llm": "0.2.0-rc.2",
158
- "@deepseek-ai/dsh-sandbox": "0.2.0-rc.2",
159
- "@deepseek-ai/dsh-session": "0.2.0-rc.2",
160
- "@deepseek-ai/dsh-settings": "0.2.0-rc.2",
161
- "@deepseek-ai/dsh-shell": "0.2.0-rc.2",
162
- "@deepseek-ai/dsh-shell-env": "0.2.0-rc.2",
163
- "@deepseek-ai/dsh-system-prompt": "0.2.0-rc.2",
164
- "@deepseek-ai/dsh-token-meter": "0.2.0-rc.2",
165
- "@deepseek-ai/dsh-tool-jobs": "0.2.0-rc.2",
166
- "@deepseek-ai/dsh-tool-str-replace-editor": "0.2.0-rc.2",
167
- "@deepseek-ai/dsh-tools": "0.2.0-rc.2",
137
+ "@deepseek-ai/dsh-agent": "0.2.1-rc.1",
138
+ "@deepseek-ai/dsh-agent-preset": "0.2.1-rc.1",
139
+ "@deepseek-ai/dsh-agent-preset-registry": "0.2.1-rc.1",
140
+ "@deepseek-ai/dsh-api-remotes": "0.2.1-rc.1",
141
+ "@deepseek-ai/dsh-api-session-controller": "0.2.1-rc.1",
142
+ "@deepseek-ai/dsh-attachment": "0.2.1-rc.1",
143
+ "@deepseek-ai/dsh-client-connection": "0.2.1-rc.1",
144
+ "@deepseek-ai/dsh-client-locale": "0.2.1-rc.1",
145
+ "@deepseek-ai/dsh-client-store": "0.2.1-rc.1",
146
+ "@deepseek-ai/dsh-client-ui-chat": "0.2.1-rc.1",
147
+ "@deepseek-ai/dsh-client-ui-conversation": "0.2.1-rc.1",
148
+ "@deepseek-ai/dsh-client-ui-primitives": "0.2.1-rc.1",
149
+ "@deepseek-ai/dsh-client-ui-renderer": "0.2.1-rc.1",
150
+ "@deepseek-ai/dsh-client-ui-settings": "0.2.1-rc.1",
151
+ "@deepseek-ai/dsh-client-ui-settings-plugins": "0.2.1-rc.1",
152
+ "@deepseek-ai/dsh-client-ui-slots": "0.2.1-rc.1",
153
+ "@deepseek-ai/dsh-client-ui-tool": "0.2.1-rc.1",
154
+ "@deepseek-ai/dsh-fs": "0.2.1-rc.1",
155
+ "@deepseek-ai/dsh-fs-local": "0.2.1-rc.1",
156
+ "@deepseek-ai/dsh-jobs": "0.2.1-rc.1",
157
+ "@deepseek-ai/dsh-jobs-local": "0.2.1-rc.1",
158
+ "@deepseek-ai/dsh-llm": "0.2.1-rc.1",
159
+ "@deepseek-ai/dsh-sandbox": "0.2.1-rc.1",
160
+ "@deepseek-ai/dsh-session": "0.2.1-rc.1",
161
+ "@deepseek-ai/dsh-settings": "0.2.1-rc.1",
162
+ "@deepseek-ai/dsh-shell": "0.2.1-rc.1",
163
+ "@deepseek-ai/dsh-shell-env": "0.2.1-rc.1",
164
+ "@deepseek-ai/dsh-system-prompt": "0.2.1-rc.1",
165
+ "@deepseek-ai/dsh-token-meter": "0.2.1-rc.1",
166
+ "@deepseek-ai/dsh-tool-jobs": "0.2.1-rc.1",
167
+ "@deepseek-ai/dsh-tool-str-replace-editor": "0.2.1-rc.1",
168
+ "@deepseek-ai/dsh-tools": "0.2.1-rc.1",
169
+ "@e2e-dev/web": "0.14.0",
168
170
  "@types/node": "^22.19.0",
169
171
  "@types/react": "^19.0.0",
170
172
  "@types/react-dom": "^19.0.0",
173
+ "ai": "^7.0.137",
174
+ "e2e": "0.19.0",
171
175
  "react": "^19.0.0",
172
176
  "react-dom": "^19.0.0",
173
177
  "sharp": "^0.35.4",
@@ -29,12 +29,13 @@
29
29
  - id: persona
30
30
  name: '@deepseek-ai/dsh-persona'
31
31
  config:
32
- suffix: Your working directory is {{cwd}}.
33
32
  prefix: You are a coding agent powered by the {{model}} model.
34
33
  - id: agent-instructions
35
34
  name: '@deepseek-ai/dsh-agent-instructions'
36
35
  config:
37
36
  maxBytes: 65536
37
+ - id: time-context
38
+ name: '@deepseek-ai/dsh-time-context'
38
39
  - id: tool-plus
39
40
  name: '@xiaoso/dsh-tool-plus'
40
41
  disabled: true
@@ -43,6 +44,8 @@
43
44
  disabled: true
44
45
  - id: tool-jobs
45
46
  name: '@deepseek-ai/dsh-tool-jobs'
47
+ - id: tool-schedule
48
+ name: '@deepseek-ai/dsh-tool-schedule'
46
49
  - id: skill-filesystem
47
50
  name: '@deepseek-ai/dsh-skill-filesystem'
48
51
  - id: tool-skill
@@ -61,7 +64,7 @@
61
64
  name: '@deepseek-ai/dsh-plan-mode'
62
65
  config:
63
66
  section: |
64
- You are in plan mode. Stay in plan mode until exit_plan_mode succeeds or the user switches the session mode. Imperative language to implement changes means plan the implementation, not execute it. A user's conversational agreement — including an answer confirming something you asked — approves nothing and does not end plan mode; fold the confirmed decision into the plan and submit it through exit_plan_mode.
67
+ You are in plan mode. Stay in plan mode until the user approves your plan through exit_plan_mode or switches the session mode. Imperative language to implement changes means plan the implementation, not execute it. A user's conversational agreement — including an answer confirming something you asked — approves nothing and does not end plan mode; fold the confirmed decision into the plan and submit it through exit_plan_mode.
65
68
 
66
69
  Explore first. Use non-mutating reads, searches, static analysis, and checks to ground the plan in the actual repository. Do not edit or write files, change configuration, run formatters or code generation that rewrites tracked files, commit, or otherwise carry out the plan. Prefer existing functions and patterns over new machinery.
67
70
 
@@ -105,29 +108,11 @@
105
108
  provider: spawn
106
109
  toolName: subagent
107
110
  modelSelectionSettings: true
108
- backgroundMode: continuable
109
111
  - id: tool-subagent-fork
110
112
  name: '@deepseek-ai/dsh-tool-subagent'
111
113
  config:
112
114
  provider: fork
113
115
  toolName: subagent_fork
114
- backgroundMode: continuable
115
- - id: tool-subagent-codex
116
- name: '@deepseek-ai/dsh-tool-subagent'
117
- disabled: true
118
- config:
119
- provider: codex
120
- toolName: subagent_codex
121
- backgroundMode: one-shot
122
- maxDepth: provider-managed
123
- - id: tool-subagent-claude-code
124
- name: '@deepseek-ai/dsh-tool-subagent'
125
- disabled: true
126
- config:
127
- provider: claude-code
128
- toolName: subagent_claude_code
129
- backgroundMode: one-shot
130
- maxDepth: provider-managed
131
116
  - id: workflow-ptc
132
117
  name: '@deepseek-ai/dsh-workflow-ptc'
133
118
  disabled: true
@@ -136,12 +121,6 @@
136
121
  - id: tool-workflow
137
122
  name: '@deepseek-ai/dsh-tool-workflow'
138
123
  disabled: true
139
- - id: tool-ralph
140
- name: '@deepseek-ai/dsh-tool-ralph'
141
- disabled: true
142
- config:
143
- subagentProvider: spawn
144
- maxRounds: 64
145
124
  - id: tool-ask-user
146
125
  name: '@deepseek-ai/dsh-tool-ask-user'
147
126
  - id: tool-todo
@@ -162,3 +141,6 @@
162
141
  - id: tool-plugin-manager
163
142
  name: '@deepseek-ai/dsh-plugin-manager/tools'
164
143
  disabled: true
144
+ - id: tool-plugin-market
145
+ name: '@deepseek-ai/dsh-plugin-market/tools'
146
+ disabled: true
@@ -29,12 +29,13 @@
29
29
  - id: persona
30
30
  name: '@deepseek-ai/dsh-persona'
31
31
  config:
32
- suffix: Your working directory is {{cwd}}.
33
32
  prefix: You are a coding agent powered by the {{model}} model.
34
33
  - id: agent-instructions
35
34
  name: '@deepseek-ai/dsh-agent-instructions'
36
35
  config:
37
36
  maxBytes: 65536
37
+ - id: time-context
38
+ name: '@deepseek-ai/dsh-time-context'
38
39
  - id: tool-plus
39
40
  name: '@xiaoso/dsh-tool-plus'
40
41
  disabled: true
@@ -43,6 +44,8 @@
43
44
  disabled: true
44
45
  - id: tool-jobs
45
46
  name: '@deepseek-ai/dsh-tool-jobs'
47
+ - id: tool-schedule
48
+ name: '@deepseek-ai/dsh-tool-schedule'
46
49
  - id: skill-filesystem
47
50
  name: '@deepseek-ai/dsh-skill-filesystem'
48
51
  - id: tool-skill
@@ -61,7 +64,7 @@
61
64
  name: '@deepseek-ai/dsh-plan-mode'
62
65
  config:
63
66
  section: |
64
- You are in plan mode. Stay in plan mode until exit_plan_mode succeeds or the user switches the session mode. Imperative language to implement changes means plan the implementation, not execute it. A user's conversational agreement — including an answer confirming something you asked — approves nothing and does not end plan mode; fold the confirmed decision into the plan and submit it through exit_plan_mode.
67
+ You are in plan mode. Stay in plan mode until the user approves your plan through exit_plan_mode or switches the session mode. Imperative language to implement changes means plan the implementation, not execute it. A user's conversational agreement — including an answer confirming something you asked — approves nothing and does not end plan mode; fold the confirmed decision into the plan and submit it through exit_plan_mode.
65
68
 
66
69
  Explore first. Use non-mutating reads, searches, static analysis, and checks to ground the plan in the actual repository. Do not edit or write files, change configuration, run formatters or code generation that rewrites tracked files, commit, or otherwise carry out the plan. Prefer existing functions and patterns over new machinery.
67
70
 
@@ -105,41 +108,17 @@
105
108
  provider: spawn
106
109
  toolName: subagent
107
110
  modelSelectionSettings: true
108
- backgroundMode: continuable
109
111
  - id: tool-subagent-fork
110
112
  name: '@deepseek-ai/dsh-tool-subagent'
111
113
  config:
112
114
  provider: fork
113
115
  toolName: subagent_fork
114
- backgroundMode: continuable
115
- - id: tool-subagent-codex
116
- name: '@deepseek-ai/dsh-tool-subagent'
117
- disabled: true
118
- config:
119
- provider: codex
120
- toolName: subagent_codex
121
- backgroundMode: one-shot
122
- maxDepth: provider-managed
123
- - id: tool-subagent-claude-code
124
- name: '@deepseek-ai/dsh-tool-subagent'
125
- disabled: true
126
- config:
127
- provider: claude-code
128
- toolName: subagent_claude_code
129
- backgroundMode: one-shot
130
- maxDepth: provider-managed
131
116
  - id: workflow-ptc
132
117
  name: '@deepseek-ai/dsh-workflow-ptc'
133
118
  config:
134
119
  provider: spawn
135
120
  - id: tool-workflow
136
121
  name: '@deepseek-ai/dsh-tool-workflow'
137
- - id: tool-ralph
138
- name: '@deepseek-ai/dsh-tool-ralph'
139
- disabled: true
140
- config:
141
- subagentProvider: spawn
142
- maxRounds: 64
143
122
  - id: tool-ask-user
144
123
  name: '@deepseek-ai/dsh-tool-ask-user'
145
124
  - id: tool-todo
@@ -156,3 +135,6 @@
156
135
  - id: tool-plugin-manager
157
136
  name: '@deepseek-ai/dsh-plugin-manager/tools'
158
137
  disabled: true
138
+ - id: tool-plugin-market
139
+ name: '@deepseek-ai/dsh-plugin-market/tools'
140
+ disabled: true