@deepseek-ai/dsh-tool-fs 0.1.7-rc.1 → 0.2.0-rc.1
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.i18n.yaml +141 -5
- package/README.md +4 -4
- package/README.zh.md +4 -4
- package/lib/index.js +9 -73
- package/lib/types/read-render.d.ts +8 -5
- package/package.json +32 -30
package/README.i18n.yaml
CHANGED
|
@@ -1,6 +1,142 @@
|
|
|
1
|
-
# Bilingual-pair consistency record (docs/i18n/README.md):
|
|
2
|
-
#
|
|
3
|
-
#
|
|
1
|
+
# Bilingual-pair consistency record for README.md (docs/i18n/README.md): per heading
|
|
2
|
+
# section, a hash of its English and Chinese blocks outside code blocks and generated regions.
|
|
3
|
+
# After editing either side, bring the other along and re-record with:
|
|
4
4
|
# pnpm run verify-translation-pairing --write packages/fs/tool-fs/README.md
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
/:
|
|
6
|
+
en: 52b93805befe8077
|
|
7
|
+
zh: 9786e662303f0e2f
|
|
8
|
+
/deepseek-ai-dsh-tool-fs:
|
|
9
|
+
en: fc8f28deebe5fa6b
|
|
10
|
+
zh: 738c6ad45034da88
|
|
11
|
+
/deepseek-ai-dsh-tool-fs/summary:
|
|
12
|
+
en: c8f608c85c8d6626
|
|
13
|
+
zh: 4133a867517baca5
|
|
14
|
+
/deepseek-ai-dsh-tool-fs/table-of-contents:
|
|
15
|
+
en: d152484eb41ac6b4
|
|
16
|
+
zh: 09388d293f9be9cb
|
|
17
|
+
/deepseek-ai-dsh-tool-fs/use-this-package:
|
|
18
|
+
en: 8fd62afcdabe55d4
|
|
19
|
+
zh: 9bdcae272575be8c
|
|
20
|
+
/deepseek-ai-dsh-tool-fs/use-this-package/minimal-composition:
|
|
21
|
+
en: eb21d89a3ecbd2d4
|
|
22
|
+
zh: f05ccbb1e7515f32
|
|
23
|
+
/deepseek-ai-dsh-tool-fs/use-this-package/the-tools:
|
|
24
|
+
en: e70e0164411016b5
|
|
25
|
+
zh: 3fa6caa8f3d70552
|
|
26
|
+
/deepseek-ai-dsh-tool-fs/use-this-package/configuration:
|
|
27
|
+
en: 7eb705e3b132fcba
|
|
28
|
+
zh: 883207b13d381f9e
|
|
29
|
+
/deepseek-ai-dsh-tool-fs/use-this-package/policy-and-sandbox-behavior:
|
|
30
|
+
en: 53d4ac2db089ef39
|
|
31
|
+
zh: 214ea051ed56f500
|
|
32
|
+
/deepseek-ai-dsh-tool-fs/use-this-package/failures-and-recovery:
|
|
33
|
+
en: 962b09e21305a04b
|
|
34
|
+
zh: 382d2b8cce217569
|
|
35
|
+
/deepseek-ai-dsh-tool-fs/understand-the-implementation:
|
|
36
|
+
en: e30f7038c28e93f8
|
|
37
|
+
zh: a3868dbd90367b13
|
|
38
|
+
/deepseek-ai-dsh-tool-fs/understand-the-implementation/design-concept:
|
|
39
|
+
en: 454b5291db9ba847
|
|
40
|
+
zh: 9fe7081dfb416c93
|
|
41
|
+
/deepseek-ai-dsh-tool-fs/understand-the-implementation/source-map:
|
|
42
|
+
en: e8220ed04480aadc
|
|
43
|
+
zh: 1cc5f9a505953102
|
|
44
|
+
/deepseek-ai-dsh-tool-fs/understand-the-implementation/per-tool-flow:
|
|
45
|
+
en: d741e01be9fddb76
|
|
46
|
+
zh: 7aa1d7ca719a4aac
|
|
47
|
+
/deepseek-ai-dsh-tool-fs/understand-the-implementation/observation-and-concurrency:
|
|
48
|
+
en: 665d437dc35bf05f
|
|
49
|
+
zh: 8004334d6a3246b4
|
|
50
|
+
/deepseek-ai-dsh-tool-fs/further-exploration:
|
|
51
|
+
en: 485bc55482f576bc
|
|
52
|
+
zh: fc5fa55b41098bd0
|
|
53
|
+
/deepseek-ai-dsh-tool-fs/model-experience:
|
|
54
|
+
en: 215e7ba838619b7b
|
|
55
|
+
zh: a311da3843709f90
|
|
56
|
+
/deepseek-ai-dsh-tool-fs/model-experience/system-prompt:
|
|
57
|
+
en: cf78b9dd5596495f
|
|
58
|
+
zh: bd44560f8c2435e8
|
|
59
|
+
/deepseek-ai-dsh-tool-fs/model-experience/system-prompt/what-the-model-sees:
|
|
60
|
+
en: b09ee4be5e522c29
|
|
61
|
+
zh: ffd30b57d7fc96e8
|
|
62
|
+
/deepseek-ai-dsh-tool-fs/model-experience/system-prompt/what-the-model-sees/read-guidance:
|
|
63
|
+
en: f8961df3f3a6a671
|
|
64
|
+
zh: 85c7bd418b40b089
|
|
65
|
+
/deepseek-ai-dsh-tool-fs/model-experience/system-prompt/what-the-model-sees/write-guidance:
|
|
66
|
+
en: 7e34af48c583f210
|
|
67
|
+
zh: e39ad6823689c665
|
|
68
|
+
/deepseek-ai-dsh-tool-fs/model-experience/system-prompt/what-the-model-sees/edit-guidance:
|
|
69
|
+
en: 28f07502a411303b
|
|
70
|
+
zh: 437897dc99fc4360
|
|
71
|
+
/deepseek-ai-dsh-tool-fs/model-experience/system-prompt/token-effect:
|
|
72
|
+
en: 7a44cabe439a879a
|
|
73
|
+
zh: 1adf9bf3de7658b6
|
|
74
|
+
/deepseek-ai-dsh-tool-fs/model-experience/system-prompt/kv-cache-effect:
|
|
75
|
+
en: 4f1b5639f91405a8
|
|
76
|
+
zh: f90ffe077a2e52a3
|
|
77
|
+
/deepseek-ai-dsh-tool-fs/model-experience/tool-schemas:
|
|
78
|
+
en: 3039bc5e7a796b21
|
|
79
|
+
zh: 6b7a9eaf69c9ea53
|
|
80
|
+
/deepseek-ai-dsh-tool-fs/model-experience/tool-schemas/what-the-model-sees:
|
|
81
|
+
en: 6f2a072c474e39e7
|
|
82
|
+
zh: dbee4c2b206bf68f
|
|
83
|
+
/deepseek-ai-dsh-tool-fs/model-experience/tool-schemas/token-effect:
|
|
84
|
+
en: 68517f7d65ef7e9d
|
|
85
|
+
zh: 544a4b81e8ea16c0
|
|
86
|
+
/deepseek-ai-dsh-tool-fs/model-experience/tool-schemas/kv-cache-effect:
|
|
87
|
+
en: 1e6d3da20012762d
|
|
88
|
+
zh: 482f8bc569b8b490
|
|
89
|
+
/deepseek-ai-dsh-tool-fs/model-experience/read-result:
|
|
90
|
+
en: ebd38733c0490428
|
|
91
|
+
zh: b45101c325efe784
|
|
92
|
+
/deepseek-ai-dsh-tool-fs/model-experience/read-result/what-the-model-sees:
|
|
93
|
+
en: 06e250bd8788248a
|
|
94
|
+
zh: e00d36b48068909a
|
|
95
|
+
/deepseek-ai-dsh-tool-fs/model-experience/read-result/token-effect:
|
|
96
|
+
en: 4269b4368622ec2f
|
|
97
|
+
zh: f4df80c1fb6972f1
|
|
98
|
+
/deepseek-ai-dsh-tool-fs/model-experience/read-result/kv-cache-effect:
|
|
99
|
+
en: f5d5f97a153f7c70
|
|
100
|
+
zh: 3d6bc05b9eadfbc2
|
|
101
|
+
/deepseek-ai-dsh-tool-fs/model-experience/image-read-result:
|
|
102
|
+
en: 9dac44e6d0b9d8de
|
|
103
|
+
zh: 7bc4dc1c5df39eaf
|
|
104
|
+
/deepseek-ai-dsh-tool-fs/model-experience/image-read-result/what-the-model-sees:
|
|
105
|
+
en: 9252b6d73776c5ff
|
|
106
|
+
zh: d6e433450989399e
|
|
107
|
+
/deepseek-ai-dsh-tool-fs/model-experience/image-read-result/token-effect:
|
|
108
|
+
en: 68bd5255f1c9ca48
|
|
109
|
+
zh: 0474213531c1aae3
|
|
110
|
+
/deepseek-ai-dsh-tool-fs/model-experience/image-read-result/kv-cache-effect:
|
|
111
|
+
en: f5d5f97a153f7c70
|
|
112
|
+
zh: 48e202e396bc5fcc
|
|
113
|
+
/deepseek-ai-dsh-tool-fs/model-experience/write-and-edit-results:
|
|
114
|
+
en: 1b3b6cfa3605d0b4
|
|
115
|
+
zh: 78e37c2aa4f76d54
|
|
116
|
+
/deepseek-ai-dsh-tool-fs/model-experience/write-and-edit-results/what-the-model-sees:
|
|
117
|
+
en: bb2a92e0e43e3273
|
|
118
|
+
zh: a744395576b48a93
|
|
119
|
+
/deepseek-ai-dsh-tool-fs/model-experience/write-and-edit-results/token-effect:
|
|
120
|
+
en: fb4d0b17a99f49cf
|
|
121
|
+
zh: 17460a2a5d72f6cc
|
|
122
|
+
/deepseek-ai-dsh-tool-fs/model-experience/write-and-edit-results/kv-cache-effect:
|
|
123
|
+
en: f5d5f97a153f7c70
|
|
124
|
+
zh: 3d6bc05b9eadfbc2
|
|
125
|
+
/deepseek-ai-dsh-tool-fs/model-experience/tool-errors:
|
|
126
|
+
en: 2d4f2c8605eccab3
|
|
127
|
+
zh: 67f1f0218f73c6bf
|
|
128
|
+
/deepseek-ai-dsh-tool-fs/model-experience/tool-errors/what-the-model-sees:
|
|
129
|
+
en: 4e8fac7bac8ced61
|
|
130
|
+
zh: 7ba921dbcddc9f97
|
|
131
|
+
/deepseek-ai-dsh-tool-fs/model-experience/tool-errors/token-effect:
|
|
132
|
+
en: 681cadd5be7b8ac1
|
|
133
|
+
zh: 65e483f62fb819d9
|
|
134
|
+
/deepseek-ai-dsh-tool-fs/model-experience/tool-errors/kv-cache-effect:
|
|
135
|
+
en: f5d5f97a153f7c70
|
|
136
|
+
zh: 3d6bc05b9eadfbc2
|
|
137
|
+
/deepseek-ai-dsh-tool-fs/known-limitations-and-deferred-work:
|
|
138
|
+
en: ce7a91d41d2f7597
|
|
139
|
+
zh: d4a3c905e124fd7f
|
|
140
|
+
/deepseek-ai-dsh-tool-fs/known-limitations-and-deferred-work/dev-note:
|
|
141
|
+
en: 0c4d0c465413d319
|
|
142
|
+
zh: a20efeb10121b927
|
package/README.md
CHANGED
|
@@ -67,7 +67,7 @@ The generated [configuration catalog](../../../docs/config-catalog.md#deepseek-a
|
|
|
67
67
|
|
|
68
68
|
Path authorization for `read` and `read_image` belongs entirely to `ctx.fs`; media-type declarations and file signatures only decide whether `read_image` accepts the bytes returned by that backend.
|
|
69
69
|
|
|
70
|
-
With the policy plugin mounted, `write` and `edit` obtain their guard from the `fs/*` intent slots, so an unread target or a stale observation fails with `FS_NOT_OBSERVED` or `FS_STALE_VERSION` and a recovery instruction. Under a confining backend (`fs-sandbox`), `write`/`edit` additionally advertise `sandbox_permissions` and `justification`; a denied mutation returns the `[sandbox: file access denied under <mode> mode]` marker with the same-turn escalation hint, and an approved retry may stamp a strictly wider mode for that one call.
|
|
70
|
+
With the policy plugin mounted, `write` and `edit` obtain their guard from the `fs/*` intent slots, so an unread target or a stale observation fails with `FS_NOT_OBSERVED` or `FS_STALE_VERSION` and a recovery instruction. Under a confining backend (`fs-sandbox`), `write`/`edit` additionally advertise `sandbox_permissions` and `justification`; a denied mutation returns the `[sandbox: file access denied under <mode> mode]` marker with the same-turn escalation hint, and an approved retry may stamp a strictly wider mode for that one call. The justification asks the model to use the language of the current user request.
|
|
71
71
|
|
|
72
72
|
### Failures and recovery
|
|
73
73
|
|
|
@@ -138,19 +138,19 @@ At assembly time, each guidance section checks `ctx.tools.get(name, scope)` and
|
|
|
138
138
|
##### Read guidance
|
|
139
139
|
|
|
140
140
|
```markdown
|
|
141
|
-
Use the read tool — not shell commands like cat — to inspect text files.
|
|
141
|
+
Use the read tool — not shell commands like cat — to inspect text files. Use offset and limit to continue reading large files.
|
|
142
142
|
```
|
|
143
143
|
|
|
144
144
|
##### Write guidance
|
|
145
145
|
|
|
146
146
|
```markdown
|
|
147
|
-
|
|
147
|
+
Read an existing file before overwriting it with write (the default fs-observation-policy requires it) and prefer edit for targeted changes.
|
|
148
148
|
```
|
|
149
149
|
|
|
150
150
|
##### Edit guidance
|
|
151
151
|
|
|
152
152
|
```markdown
|
|
153
|
-
|
|
153
|
+
Read a file before editing it (the default fs-observation-policy requires it), unless you just created or edited it in this session.
|
|
154
154
|
```
|
|
155
155
|
|
|
156
156
|
#### Token effect
|
package/README.zh.md
CHANGED
|
@@ -67,7 +67,7 @@ kind: "package-reference"
|
|
|
67
67
|
|
|
68
68
|
`read` 与 `read_image` 的路径授权完全由 `ctx.fs` 负责;媒体类型声明和文件签名只决定 `read_image` 是否接受该后端返回的字节。
|
|
69
69
|
|
|
70
|
-
挂载策略插件后,`write` 与 `edit` 从 `fs/*` 意图槽位取得防护,因此未读目标或陈旧观察会以 `FS_NOT_OBSERVED` 或 `FS_STALE_VERSION` 及恢复指令失败。使用施加沙箱限制的后端(`fs-sandbox`)时,`write`/`edit` 还会公开 `sandbox_permissions` 与 `justification`;被拒绝的变更返回 `[sandbox: file access denied under <mode> mode]`
|
|
70
|
+
挂载策略插件后,`write` 与 `edit` 从 `fs/*` 意图槽位取得防护,因此未读目标或陈旧观察会以 `FS_NOT_OBSERVED` 或 `FS_STALE_VERSION` 及恢复指令失败。使用施加沙箱限制的后端(`fs-sandbox`)时,`write`/`edit` 还会公开 `sandbox_permissions` 与 `justification`;被拒绝的变更返回 `[sandbox: file access denied under <mode> mode]` 标记与同轮次升级提示,获批的重试可以在该次调用中加盖严格更宽的模式。理由字段提示模型使用用户当前提问的语言。
|
|
71
71
|
|
|
72
72
|
### 失败与恢复
|
|
73
73
|
|
|
@@ -138,19 +138,19 @@ kind: "package-reference"
|
|
|
138
138
|
##### Read 指导
|
|
139
139
|
|
|
140
140
|
```markdown
|
|
141
|
-
Use the read tool — not shell commands like cat — to inspect text files.
|
|
141
|
+
Use the read tool — not shell commands like cat — to inspect text files. Use offset and limit to continue reading large files.
|
|
142
142
|
```
|
|
143
143
|
|
|
144
144
|
##### Write 指导
|
|
145
145
|
|
|
146
146
|
```markdown
|
|
147
|
-
|
|
147
|
+
Read an existing file before overwriting it with write (the default fs-observation-policy requires it) and prefer edit for targeted changes.
|
|
148
148
|
```
|
|
149
149
|
|
|
150
150
|
##### Edit 指导
|
|
151
151
|
|
|
152
152
|
```markdown
|
|
153
|
-
|
|
153
|
+
Read a file before editing it (the default fs-observation-policy requires it), unless you just created or edited it in this session.
|
|
154
154
|
```
|
|
155
155
|
|
|
156
156
|
#### Token 影响
|
package/lib/index.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import z from "@deepseek-ai/schemastery";
|
|
2
2
|
import { defineTool } from "@deepseek-ai/dsh-tools";
|
|
3
3
|
import { FsError } from "@deepseek-ai/dsh-fs";
|
|
4
|
+
import { readLangHintForPath as langFromPath } from "@deepseek-ai/dsh-util-code-language";
|
|
4
5
|
import { structuredPatch } from "diff";
|
|
5
6
|
import { basename, extname } from "node:path";
|
|
6
7
|
import { AttachmentError, AttachmentId } from "@deepseek-ai/dsh-attachment";
|
|
7
|
-
import { ESCALATION_TARGETS, approveEscalation, escalationHintMarker, sandboxDenialMarker, validateEscalationArgs } from "@deepseek-ai/dsh-sandbox";
|
|
8
|
+
import { ESCALATION_TARGETS, approveEscalation, escalationHintMarker, sandboxDenialMarker, sandboxPermissionsDescription, validateEscalationArgs } from "@deepseek-ai/dsh-sandbox";
|
|
8
9
|
//#region lib/types/read-render.js
|
|
9
10
|
/**
|
|
10
11
|
* Pure read presentation: turn provider-decoded text into a bounded, line-numbered window and
|
|
@@ -110,71 +111,6 @@ ${outcome.lines.length > 0 ? `${outcome.lines.map((line) => `${line.number}: ${l
|
|
|
110
111
|
</content>`;
|
|
111
112
|
}
|
|
112
113
|
/**
|
|
113
|
-
* Lowercased file-extension to syntax-highlighting language hint. Keys are the
|
|
114
|
-
* extension without its dot; a UI treats an absent key as plain text. The map is
|
|
115
|
-
* intentionally small — common source, config, and markup extensions a
|
|
116
|
-
* line-numbered code view benefits from highlighting — not an exhaustive registry.
|
|
117
|
-
*/
|
|
118
|
-
const LANG_BY_EXTENSION = {
|
|
119
|
-
ts: "ts",
|
|
120
|
-
tsx: "tsx",
|
|
121
|
-
mts: "ts",
|
|
122
|
-
cts: "ts",
|
|
123
|
-
js: "js",
|
|
124
|
-
jsx: "jsx",
|
|
125
|
-
mjs: "js",
|
|
126
|
-
cjs: "js",
|
|
127
|
-
json: "json",
|
|
128
|
-
jsonc: "json",
|
|
129
|
-
py: "py",
|
|
130
|
-
rb: "rb",
|
|
131
|
-
go: "go",
|
|
132
|
-
rs: "rs",
|
|
133
|
-
java: "java",
|
|
134
|
-
c: "c",
|
|
135
|
-
h: "c",
|
|
136
|
-
cc: "cpp",
|
|
137
|
-
cpp: "cpp",
|
|
138
|
-
hpp: "cpp",
|
|
139
|
-
cxx: "cpp",
|
|
140
|
-
cs: "cs",
|
|
141
|
-
kt: "kotlin",
|
|
142
|
-
swift: "swift",
|
|
143
|
-
php: "php",
|
|
144
|
-
sh: "sh",
|
|
145
|
-
bash: "sh",
|
|
146
|
-
zsh: "sh",
|
|
147
|
-
yaml: "yaml",
|
|
148
|
-
yml: "yaml",
|
|
149
|
-
toml: "toml",
|
|
150
|
-
ini: "ini",
|
|
151
|
-
md: "md",
|
|
152
|
-
markdown: "md",
|
|
153
|
-
mdx: "mdx",
|
|
154
|
-
html: "html",
|
|
155
|
-
htm: "html",
|
|
156
|
-
css: "css",
|
|
157
|
-
scss: "scss",
|
|
158
|
-
less: "less",
|
|
159
|
-
sql: "sql",
|
|
160
|
-
xml: "xml",
|
|
161
|
-
lua: "lua"
|
|
162
|
-
};
|
|
163
|
-
/**
|
|
164
|
-
* Derive a syntax-highlighting language hint from a read path's file extension.
|
|
165
|
-
* Pure and case-insensitive on the extension; a dotfile with no extension
|
|
166
|
-
* (`.gitignore`) and an unknown extension both yield `undefined`.
|
|
167
|
-
* @param path - the model-facing path the read reported.
|
|
168
|
-
* @returns the language hint for {@link LANG_BY_EXTENSION}, or `undefined` when the extension maps to none.
|
|
169
|
-
*/
|
|
170
|
-
function langFromPath(path) {
|
|
171
|
-
const base = path.slice(Math.max(path.lastIndexOf("/"), path.lastIndexOf("\\")) + 1);
|
|
172
|
-
const dot = base.lastIndexOf(".");
|
|
173
|
-
if (dot <= 0) return void 0;
|
|
174
|
-
const ext = base.slice(dot + 1).toLowerCase();
|
|
175
|
-
return Object.hasOwn(LANG_BY_EXTENSION, ext) ? LANG_BY_EXTENSION[ext] : void 0;
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
114
|
* Whether `value` is a valid {@link FileTextLine} (defensive narrowing from
|
|
179
115
|
* opaque `meta`). `number` must be a 1-based integer line number, since a card
|
|
180
116
|
* rendered from a zero, fractional, or non-finite line number would violate the
|
|
@@ -320,7 +256,7 @@ function applyReadTool(ctx, caps) {
|
|
|
320
256
|
ctx.systemPrompt.section({
|
|
321
257
|
name: "tool:read",
|
|
322
258
|
order: ctx.systemPrompt.getSectionOrder("TOOL_READ"),
|
|
323
|
-
text: ({ scope }) => ctx.tools.get("read", scope) === void 0 ? "" : "Use the read tool — not shell commands like cat — to inspect text files.
|
|
259
|
+
text: ({ scope }) => ctx.tools.get("read", scope) === void 0 ? "" : "Use the read tool — not shell commands like cat — to inspect text files. Use offset and limit to continue reading large files."
|
|
324
260
|
});
|
|
325
261
|
ctx.tools.register(defineTool({
|
|
326
262
|
name: "read",
|
|
@@ -585,7 +521,7 @@ function applyWriteTool(ctx, sandbox) {
|
|
|
585
521
|
ctx.systemPrompt.section({
|
|
586
522
|
name: "tool:write",
|
|
587
523
|
order: ctx.systemPrompt.getSectionOrder("TOOL_WRITE"),
|
|
588
|
-
text: ({ scope }) => ctx.tools.get("write", scope) === void 0 ? "" : "
|
|
524
|
+
text: ({ scope }) => ctx.tools.get("write", scope) === void 0 ? "" : "Read an existing file before overwriting it with write (the default fs-observation-policy requires it)" + (ctx.tools.get("edit", scope) === void 0 ? "" : " and prefer edit for targeted changes") + "."
|
|
589
525
|
});
|
|
590
526
|
ctx.tools.register(defineTool({
|
|
591
527
|
name: "write",
|
|
@@ -733,7 +669,7 @@ function applyEditTool(ctx, sandbox) {
|
|
|
733
669
|
ctx.systemPrompt.section({
|
|
734
670
|
name: "tool:edit",
|
|
735
671
|
order: ctx.systemPrompt.getSectionOrder("TOOL_EDIT"),
|
|
736
|
-
text: ({ scope }) => ctx.tools.get("edit", scope) === void 0 ? "" : "
|
|
672
|
+
text: ({ scope }) => ctx.tools.get("edit", scope) === void 0 ? "" : "Read a file before editing it (the default fs-observation-policy requires it), unless you just created or edited it in this session."
|
|
737
673
|
});
|
|
738
674
|
ctx.tools.register(defineTool({
|
|
739
675
|
name: "edit",
|
|
@@ -747,7 +683,7 @@ function applyEditTool(ctx, sandbox) {
|
|
|
747
683
|
old_string: {
|
|
748
684
|
type: "string",
|
|
749
685
|
required: true,
|
|
750
|
-
description: "Literal text to replace.
|
|
686
|
+
description: "Literal text to replace."
|
|
751
687
|
},
|
|
752
688
|
new_string: {
|
|
753
689
|
type: "string",
|
|
@@ -1037,7 +973,7 @@ function imageReadContent(value) {
|
|
|
1037
973
|
function applyReadImageTool(ctx) {
|
|
1038
974
|
ctx.tools.register(defineTool({
|
|
1039
975
|
name: "read_image",
|
|
1040
|
-
description: "Read a PNG/JPEG/WebP/GIF file and return the image itself.
|
|
976
|
+
description: "Read a PNG/JPEG/WebP/GIF file and return the image itself. Large images are downscaled automatically; do not install image libraries or create thumbnails to inspect an image.",
|
|
1041
977
|
parameters: { file_path: {
|
|
1042
978
|
type: "string",
|
|
1043
979
|
required: true,
|
|
@@ -1162,11 +1098,11 @@ var FsSandboxController = class {
|
|
|
1162
1098
|
sandbox_permissions: {
|
|
1163
1099
|
type: "string",
|
|
1164
1100
|
enum: [...this.escalationModes],
|
|
1165
|
-
description: "
|
|
1101
|
+
description: sandboxPermissionsDescription("operation")
|
|
1166
1102
|
},
|
|
1167
1103
|
justification: {
|
|
1168
1104
|
type: "string",
|
|
1169
|
-
description: "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access."
|
|
1105
|
+
description: "Required with sandbox_permissions: one sentence for the user explaining why this exact file operation needs the wider access. Use the language of the user’s current request."
|
|
1170
1106
|
}
|
|
1171
1107
|
};
|
|
1172
1108
|
}
|
|
@@ -64,13 +64,16 @@ export declare function buildWindow(chunks: AsyncIterable<string> | Iterable<str
|
|
|
64
64
|
*/
|
|
65
65
|
export declare function formatReadOutput(displayPath: string, outcome: FileReadOutcome): string;
|
|
66
66
|
/**
|
|
67
|
-
* Derive
|
|
68
|
-
*
|
|
69
|
-
* (
|
|
67
|
+
* Derive the persisted `lang` hint from a read path's file extension. The shared
|
|
68
|
+
* table in `@deepseek-ai/dsh-util-code-language` owns the recognized suffixes and
|
|
69
|
+
* the path rules (both separators, a leading dot as the extension separator, and
|
|
70
|
+
* prototype-key safety); `readLangHintForPath` projects the read card's short ids
|
|
71
|
+
* over it, so a suffix whose value a recorded session already holds keeps it
|
|
72
|
+
* byte-identical while every other suffix uses its language's short name.
|
|
70
73
|
* @param path - the model-facing path the read reported.
|
|
71
|
-
* @returns the language hint
|
|
74
|
+
* @returns the persisted language hint, or `undefined` when the extension maps to none.
|
|
72
75
|
*/
|
|
73
|
-
export
|
|
76
|
+
export { readLangHintForPath as langFromPath } from '@deepseek-ai/dsh-util-code-language';
|
|
74
77
|
/**
|
|
75
78
|
* The `read` tool's private `tool/result` `meta` payload: the structured
|
|
76
79
|
* line-numbered window a capable UI renders as a code view. Attached opaquely (as
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deepseek-ai/dsh-tool-fs",
|
|
3
3
|
"description": "Model-facing filesystem tools (read, write, edit) over the DeepSeek Harness filesystem seam (ctx.fs)",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.2.0-rc.1",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -28,39 +28,41 @@
|
|
|
28
28
|
"license": "MIT",
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"diff": "^9.0.0",
|
|
31
|
-
"@deepseek-ai/schemastery": "~3.18.4"
|
|
31
|
+
"@deepseek-ai/schemastery": "~3.18.4",
|
|
32
|
+
"@deepseek-ai/dsh-util-code-language": "0.2.0-rc.1"
|
|
32
33
|
},
|
|
33
34
|
"peerDependencies": {
|
|
34
|
-
"@deepseek-ai/dsh-attachment": "0.
|
|
35
|
-
"@deepseek-ai/dsh-fs": "0.
|
|
36
|
-
"@deepseek-ai/dsh-llm": "0.
|
|
37
|
-
"@deepseek-ai/dsh-sandbox": "0.
|
|
38
|
-
"@deepseek-ai/dsh-
|
|
39
|
-
"@deepseek-ai/dsh-
|
|
40
|
-
"@deepseek-ai/dsh-
|
|
41
|
-
"@deepseek-ai/dsh-
|
|
42
|
-
"@deepseek-ai/
|
|
43
|
-
"@deepseek-ai/
|
|
35
|
+
"@deepseek-ai/dsh-attachment": "0.2.0-rc.1",
|
|
36
|
+
"@deepseek-ai/dsh-fs": "0.2.0-rc.1",
|
|
37
|
+
"@deepseek-ai/dsh-llm": "0.2.0-rc.1",
|
|
38
|
+
"@deepseek-ai/dsh-sandbox": "0.2.0-rc.1",
|
|
39
|
+
"@deepseek-ai/dsh-session": "0.2.0-rc.1",
|
|
40
|
+
"@deepseek-ai/dsh-system-prompt": "0.2.0-rc.1",
|
|
41
|
+
"@deepseek-ai/dsh-sandbox-policy": "0.2.0-rc.1",
|
|
42
|
+
"@deepseek-ai/dsh-user-approval": "0.2.0-rc.1",
|
|
43
|
+
"@deepseek-ai/cordis": "~4.0.4",
|
|
44
|
+
"@deepseek-ai/dsh-tools": "0.2.0-rc.1"
|
|
44
45
|
},
|
|
45
46
|
"devDependencies": {
|
|
46
|
-
"@deepseek-ai/dsh-agent": "0.
|
|
47
|
-
"@deepseek-ai/dsh-agent-loop": "0.
|
|
48
|
-
"@deepseek-ai/dsh-agent-loop-testkit": "0.
|
|
49
|
-
"@deepseek-ai/dsh-attachment": "0.
|
|
50
|
-
"@deepseek-ai/dsh-fs": "0.
|
|
51
|
-
"@deepseek-ai/dsh-fs
|
|
52
|
-
"@deepseek-ai/dsh-fs-observation-policy": "0.
|
|
53
|
-
"@deepseek-ai/dsh-
|
|
54
|
-
"@deepseek-ai/dsh-
|
|
55
|
-
"@deepseek-ai/dsh-
|
|
56
|
-
"@deepseek-ai/dsh-
|
|
47
|
+
"@deepseek-ai/dsh-agent": "0.2.0-rc.1",
|
|
48
|
+
"@deepseek-ai/dsh-agent-loop": "0.2.0-rc.1",
|
|
49
|
+
"@deepseek-ai/dsh-agent-loop-testkit": "0.2.0-rc.1",
|
|
50
|
+
"@deepseek-ai/dsh-attachment": "0.2.0-rc.1",
|
|
51
|
+
"@deepseek-ai/dsh-fs-local": "0.2.0-rc.1",
|
|
52
|
+
"@deepseek-ai/dsh-fs": "0.2.0-rc.1",
|
|
53
|
+
"@deepseek-ai/dsh-fs-observation-policy": "0.2.0-rc.1",
|
|
54
|
+
"@deepseek-ai/dsh-llm": "0.2.0-rc.1",
|
|
55
|
+
"@deepseek-ai/dsh-llm-deepseek": "0.2.0-rc.1",
|
|
56
|
+
"@deepseek-ai/dsh-llm-deepseek-api-key": "0.2.0-rc.1",
|
|
57
|
+
"@deepseek-ai/dsh-sandbox": "0.2.0-rc.1",
|
|
58
|
+
"@deepseek-ai/dsh-system-prompt": "0.2.0-rc.1",
|
|
59
|
+
"@deepseek-ai/dsh-tools": "0.2.0-rc.1",
|
|
57
60
|
"@deepseek-ai/cordis": "~4.0.4",
|
|
58
|
-
"@deepseek-ai/dsh-session-projection": "0.
|
|
59
|
-
"@deepseek-ai/dsh-scope": "0.
|
|
60
|
-
"@deepseek-ai/dsh-ptc-runtime": "0.
|
|
61
|
-
"@deepseek-ai/dsh-
|
|
62
|
-
"@deepseek-ai/dsh-sandbox": "0.
|
|
63
|
-
"@deepseek-ai/dsh-
|
|
64
|
-
"@deepseek-ai/dsh-llm": "0.1.7-rc.1"
|
|
61
|
+
"@deepseek-ai/dsh-session-projection": "0.2.0-rc.1",
|
|
62
|
+
"@deepseek-ai/dsh-scope": "0.2.0-rc.1",
|
|
63
|
+
"@deepseek-ai/dsh-ptc-runtime": "0.2.0-rc.1",
|
|
64
|
+
"@deepseek-ai/dsh-session": "0.2.0-rc.1",
|
|
65
|
+
"@deepseek-ai/dsh-sandbox-policy": "0.2.0-rc.1",
|
|
66
|
+
"@deepseek-ai/dsh-user-approval": "0.2.0-rc.1"
|
|
65
67
|
}
|
|
66
68
|
}
|