@huanlin/dsh-plugin-codegraph-tool 0.1.8
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/LICENSE +21 -0
- package/README.md +17 -0
- package/lib/compose.d.ts +73 -0
- package/lib/compose.js +138 -0
- package/lib/index.d.ts +89 -0
- package/lib/index.js +432 -0
- package/lib/invariant.d.ts +16 -0
- package/lib/invariant.js +22 -0
- package/lib/projection.d.ts +73 -0
- package/lib/projection.js +68 -0
- package/lib/render.d.ts +16 -0
- package/lib/render.js +184 -0
- package/lib/schema.d.ts +1441 -0
- package/lib/schema.js +255 -0
- package/lib/source.d.ts +41 -0
- package/lib/source.js +48 -0
- package/package.json +69 -0
package/lib/schema.js
ADDED
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `codegraph` tool's model-facing schemas: the parameter spec the model fills in and the
|
|
3
|
+
* canonical output union each operation returns.
|
|
4
|
+
*
|
|
5
|
+
* The output is a closed `oneOf` keyed on `operation`, not one loose object with every field
|
|
6
|
+
* optional, so a Code Mode program that switches on `operation` gets exactly the fields that
|
|
7
|
+
* operation produces and nothing it must test for. Members are built from shared field groups
|
|
8
|
+
* because ten hand-written copies of a symbol projection would drift apart.
|
|
9
|
+
* @module @huanlin/dsh-plugin-codegraph-tool/schema
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Operations the primary `codegraph` tool accepts. The first eight map to a seam query; the last two
|
|
13
|
+
* compose. `index` is deliberately absent: it runs through the dedicated `codegraph_index` tool, which
|
|
14
|
+
* carries its own (much larger) timeout budget instead of this tool's query-sized one.
|
|
15
|
+
*/
|
|
16
|
+
const QUERY_OPERATIONS = [
|
|
17
|
+
'search',
|
|
18
|
+
'node',
|
|
19
|
+
'callers',
|
|
20
|
+
'callees',
|
|
21
|
+
'impact',
|
|
22
|
+
'trace',
|
|
23
|
+
'files',
|
|
24
|
+
'status',
|
|
25
|
+
'explore',
|
|
26
|
+
'context',
|
|
27
|
+
];
|
|
28
|
+
/** Every operation the tool family exposes, across both the query tool and the dedicated index tool. */
|
|
29
|
+
export const CODEGRAPH_OPERATIONS = [...QUERY_OPERATIONS, 'index'];
|
|
30
|
+
/** The model-facing projection of one declaration. */
|
|
31
|
+
const SYMBOL = {
|
|
32
|
+
type: 'object',
|
|
33
|
+
additionalProperties: false,
|
|
34
|
+
properties: {
|
|
35
|
+
name: { type: 'string', required: true },
|
|
36
|
+
qualified_name: { type: 'string', required: true },
|
|
37
|
+
kind: { type: 'string', required: true },
|
|
38
|
+
path: { type: 'string', required: true },
|
|
39
|
+
line: { type: 'integer', required: true },
|
|
40
|
+
end_line: { type: 'integer', required: true },
|
|
41
|
+
language: { type: 'string', required: true },
|
|
42
|
+
exported: { type: 'boolean', required: true },
|
|
43
|
+
signature: { type: 'string' },
|
|
44
|
+
docstring: { type: 'string' },
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
/** A symbol reached through an edge, carrying how it was reached. */
|
|
48
|
+
const RELATION = {
|
|
49
|
+
type: 'object',
|
|
50
|
+
additionalProperties: false,
|
|
51
|
+
properties: {
|
|
52
|
+
...SYMBOL.properties,
|
|
53
|
+
via: { type: 'string', required: true },
|
|
54
|
+
site_line: { type: 'integer' },
|
|
55
|
+
site_count: { type: 'integer', required: true },
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
/** A symbol reached by a transitive walk. */
|
|
59
|
+
const AFFECTED = {
|
|
60
|
+
type: 'object',
|
|
61
|
+
additionalProperties: false,
|
|
62
|
+
properties: {
|
|
63
|
+
...SYMBOL.properties,
|
|
64
|
+
via: { type: 'string', required: true },
|
|
65
|
+
distance: { type: 'integer', required: true },
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
/** One hop of a traced path; the first hop of a path carries no `via`. */
|
|
69
|
+
const HOP = {
|
|
70
|
+
type: 'object',
|
|
71
|
+
additionalProperties: false,
|
|
72
|
+
properties: {
|
|
73
|
+
...SYMBOL.properties,
|
|
74
|
+
via: { type: 'string' },
|
|
75
|
+
site_line: { type: 'integer' },
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
/** One indexed file. */
|
|
79
|
+
const FILE = {
|
|
80
|
+
type: 'object',
|
|
81
|
+
additionalProperties: false,
|
|
82
|
+
properties: {
|
|
83
|
+
path: { type: 'string', required: true },
|
|
84
|
+
language: { type: 'string', required: true },
|
|
85
|
+
size: { type: 'integer', required: true },
|
|
86
|
+
symbol_count: { type: 'integer', required: true },
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
/** One file's declarations plus the source text backing them. */
|
|
90
|
+
const EXPLORED_FILE = {
|
|
91
|
+
type: 'object',
|
|
92
|
+
additionalProperties: false,
|
|
93
|
+
properties: {
|
|
94
|
+
path: { type: 'string', required: true },
|
|
95
|
+
symbols: { type: 'array', required: true, items: SYMBOL },
|
|
96
|
+
code: { required: true, oneOf: [{ type: 'null' }, { type: 'string' }] },
|
|
97
|
+
code_start_line: { type: 'integer' },
|
|
98
|
+
truncated: { type: 'boolean', required: true },
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
/** A nullable symbol: the honest answer when a requested name matches no declaration. */
|
|
102
|
+
const MAYBE_SYMBOL = { required: true, oneOf: [{ type: 'null' }, SYMBOL] };
|
|
103
|
+
/** One language's share of an indexed or newly-indexed workspace. Shared by `status` and `index`. */
|
|
104
|
+
const LANGUAGE_COUNT = {
|
|
105
|
+
type: 'object',
|
|
106
|
+
additionalProperties: false,
|
|
107
|
+
properties: {
|
|
108
|
+
language: { type: 'string', required: true },
|
|
109
|
+
file_count: { type: 'integer', required: true },
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
/** Bounds every truncatable member reports, so a capped answer is never read as a complete one. */
|
|
113
|
+
const COUNTS = {
|
|
114
|
+
total: { type: 'integer', required: true },
|
|
115
|
+
truncated: { type: 'boolean', required: true },
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Build one `oneOf` member for a fixed operation name.
|
|
119
|
+
*
|
|
120
|
+
* Both type parameters are `const` so the member keeps its literal types: without them the helper
|
|
121
|
+
* would widen `operation` to the whole union and erase each member's own fields, and `InferValue`
|
|
122
|
+
* would produce one shapeless object instead of a discriminated union.
|
|
123
|
+
* @param operation - the literal `operation` value discriminating this member.
|
|
124
|
+
* @param properties - the fields this operation returns beyond the shared two.
|
|
125
|
+
* @returns the member's value schema.
|
|
126
|
+
*/
|
|
127
|
+
function member(operation, properties) {
|
|
128
|
+
return {
|
|
129
|
+
type: 'object',
|
|
130
|
+
additionalProperties: false,
|
|
131
|
+
properties: {
|
|
132
|
+
operation: { type: 'string', required: true, const: operation },
|
|
133
|
+
project_path: { type: 'string', required: true },
|
|
134
|
+
...properties,
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/** The canonical value every `codegraph` call returns, discriminated by `operation`. */
|
|
139
|
+
export const CODEGRAPH_OUTPUT_SCHEMA = {
|
|
140
|
+
oneOf: [
|
|
141
|
+
member('search', {
|
|
142
|
+
symbols: { type: 'array', required: true, items: SYMBOL },
|
|
143
|
+
...COUNTS,
|
|
144
|
+
}),
|
|
145
|
+
member('node', {
|
|
146
|
+
symbol: MAYBE_SYMBOL,
|
|
147
|
+
incoming: { type: 'array', required: true, items: RELATION },
|
|
148
|
+
outgoing: { type: 'array', required: true, items: RELATION },
|
|
149
|
+
alternatives: { type: 'array', required: true, items: SYMBOL },
|
|
150
|
+
code: { required: true, oneOf: [{ type: 'null' }, { type: 'string' }] },
|
|
151
|
+
}),
|
|
152
|
+
member('callers', {
|
|
153
|
+
symbol: MAYBE_SYMBOL,
|
|
154
|
+
relations: { type: 'array', required: true, items: RELATION },
|
|
155
|
+
...COUNTS,
|
|
156
|
+
}),
|
|
157
|
+
member('callees', {
|
|
158
|
+
symbol: MAYBE_SYMBOL,
|
|
159
|
+
relations: { type: 'array', required: true, items: RELATION },
|
|
160
|
+
...COUNTS,
|
|
161
|
+
}),
|
|
162
|
+
member('impact', {
|
|
163
|
+
symbol: MAYBE_SYMBOL,
|
|
164
|
+
affected: { type: 'array', required: true, items: AFFECTED },
|
|
165
|
+
...COUNTS,
|
|
166
|
+
}),
|
|
167
|
+
member('trace', {
|
|
168
|
+
from: MAYBE_SYMBOL,
|
|
169
|
+
to: MAYBE_SYMBOL,
|
|
170
|
+
paths: { type: 'array', required: true, items: { type: 'array', items: HOP } },
|
|
171
|
+
}),
|
|
172
|
+
member('files', {
|
|
173
|
+
files: { type: 'array', required: true, items: FILE },
|
|
174
|
+
...COUNTS,
|
|
175
|
+
}),
|
|
176
|
+
member('status', {
|
|
177
|
+
// Only `indexed` is required: when no store claims the root, none of the other fields have an
|
|
178
|
+
// honest value to report, and the tool answers `{ indexed: false }` rather than failing.
|
|
179
|
+
indexed: { type: 'boolean', required: true },
|
|
180
|
+
file_count: { type: 'integer' },
|
|
181
|
+
symbol_count: { type: 'integer' },
|
|
182
|
+
edge_count: { type: 'integer' },
|
|
183
|
+
format_version: { type: 'integer' },
|
|
184
|
+
indexed_at: { oneOf: [{ type: 'null' }, { type: 'integer' }] },
|
|
185
|
+
languages: { type: 'array', items: LANGUAGE_COUNT },
|
|
186
|
+
stale_file_count: { type: 'integer' },
|
|
187
|
+
stale_file_count_truncated: { type: 'boolean' },
|
|
188
|
+
}),
|
|
189
|
+
member('explore', {
|
|
190
|
+
files: { type: 'array', required: true, items: EXPLORED_FILE },
|
|
191
|
+
...COUNTS,
|
|
192
|
+
}),
|
|
193
|
+
member('context', {
|
|
194
|
+
task: { type: 'string', required: true },
|
|
195
|
+
entry_points: { type: 'array', required: true, items: SYMBOL },
|
|
196
|
+
related: { type: 'array', required: true, items: RELATION },
|
|
197
|
+
files: { type: 'array', required: true, items: EXPLORED_FILE },
|
|
198
|
+
}),
|
|
199
|
+
member('index', {
|
|
200
|
+
files_indexed: { type: 'integer', required: true },
|
|
201
|
+
files_skipped: { type: 'integer', required: true },
|
|
202
|
+
symbol_count: { type: 'integer', required: true },
|
|
203
|
+
edge_count: { type: 'integer', required: true },
|
|
204
|
+
unresolved_count: { type: 'integer', required: true },
|
|
205
|
+
unresolved_likely_internal_count: { type: 'integer', required: true },
|
|
206
|
+
languages: { type: 'array', required: true, items: LANGUAGE_COUNT },
|
|
207
|
+
}),
|
|
208
|
+
],
|
|
209
|
+
};
|
|
210
|
+
/** The parameters the model fills in. Which ones apply depends on `operation`. */
|
|
211
|
+
export const CODEGRAPH_PARAMETERS = {
|
|
212
|
+
operation: {
|
|
213
|
+
type: 'string',
|
|
214
|
+
required: true,
|
|
215
|
+
enum: [...QUERY_OPERATIONS],
|
|
216
|
+
description: 'search (find declarations by name), node (one symbol with its callers and callees), callers, callees, impact (what a change reaches), trace (call path from one symbol to another), files (indexed file list), status (index size and freshness), explore (several related symbols with their source), context (everything relevant to a task). To build or refresh the index itself, call the codegraph_index tool instead.',
|
|
217
|
+
},
|
|
218
|
+
symbol: {
|
|
219
|
+
type: 'string',
|
|
220
|
+
description: 'The symbol name for node, callers, callees, and impact. Simple or qualified.',
|
|
221
|
+
},
|
|
222
|
+
query: {
|
|
223
|
+
type: 'string',
|
|
224
|
+
description: 'The search text for search and explore. Matches names, qualified names, signatures, and documentation.',
|
|
225
|
+
},
|
|
226
|
+
task: {
|
|
227
|
+
type: 'string',
|
|
228
|
+
description: 'The task, bug, or feature to gather context for. Required by context.',
|
|
229
|
+
},
|
|
230
|
+
from: { type: 'string', description: 'The symbol a traced flow starts at. Required by trace.' },
|
|
231
|
+
to: { type: 'string', description: 'The symbol a traced flow should reach. Required by trace.' },
|
|
232
|
+
path: { type: 'string', description: 'Restrict files to this directory, relative to the project root.' },
|
|
233
|
+
pattern: { type: 'string', description: 'Restrict files to paths matching this glob, e.g. src/pages/*.tsx.' },
|
|
234
|
+
kind: { type: 'string', description: 'Restrict search to one declaration kind, e.g. function, class, interface.' },
|
|
235
|
+
language: { type: 'string', description: 'Restrict search to one language, e.g. typescript, python, go.' },
|
|
236
|
+
limit: { type: 'number', description: 'Largest number of results to return.' },
|
|
237
|
+
depth: { type: 'number', description: 'Hops to traverse for impact and trace.' },
|
|
238
|
+
include_code: { type: 'boolean', description: 'Include source text for node. explore and context always include it.' },
|
|
239
|
+
project_path: {
|
|
240
|
+
type: 'string',
|
|
241
|
+
description: 'Absolute path of another indexed project to query. Defaults to this session\'s workspace.',
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
/**
|
|
245
|
+
* The parameters the dedicated `codegraph_index` tool takes: only the project to (re)index. It
|
|
246
|
+
* needs no `operation` — building the index is the only thing this tool does — and none of the
|
|
247
|
+
* query-side fields (`symbol`, `query`, `limit`, …), which an index run has no use for.
|
|
248
|
+
*/
|
|
249
|
+
export const CODEGRAPH_INDEX_PARAMETERS = {
|
|
250
|
+
project_path: {
|
|
251
|
+
type: 'string',
|
|
252
|
+
description: 'Absolute path of the project to index. Defaults to this session\'s workspace.',
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
//# sourceMappingURL=schema.js.map
|
package/lib/source.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source retrieval for the operations that return code. Reads go through `ctx.fs`, never
|
|
3
|
+
* `node:fs`: the filesystem seam is what resolves a path against the session workspace, enforces
|
|
4
|
+
* read policy, and reaches a remote sandbox, so a tool that opened files directly would bypass all
|
|
5
|
+
* three for the one operation most likely to touch a file it should not.
|
|
6
|
+
*
|
|
7
|
+
* A read that fails is not an error here. The graph names a file the index recorded, which may since
|
|
8
|
+
* have been renamed or deleted; the honest answer is the symbols with `code: null`, not a failed
|
|
9
|
+
* query.
|
|
10
|
+
* @module @huanlin/dsh-plugin-codegraph-tool/source
|
|
11
|
+
*/
|
|
12
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
13
|
+
/** The line window a source slice covers, and whether it was cut short. */
|
|
14
|
+
export interface SourceSlice {
|
|
15
|
+
/** The retrieved text, or null when the file could not be read. */
|
|
16
|
+
readonly code: string | null;
|
|
17
|
+
/** One-based first line of {@link code}, when text was retrieved. */
|
|
18
|
+
readonly startLine?: number;
|
|
19
|
+
/** Whether the requested range was cut by the line or character cap. */
|
|
20
|
+
readonly truncated: boolean;
|
|
21
|
+
}
|
|
22
|
+
/** Bounds on one retrieved slice. */
|
|
23
|
+
export interface SourceLimits {
|
|
24
|
+
/** Largest number of lines one slice may carry. */
|
|
25
|
+
readonly maxLines: number;
|
|
26
|
+
/** Largest number of characters one slice may carry. */
|
|
27
|
+
readonly maxChars: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Read a one-based inclusive line range from a project-relative file.
|
|
31
|
+
* @param ctx - the plugin context, whose `fs` performs the read.
|
|
32
|
+
* @param projectRoot - absolute path the file path resolves against.
|
|
33
|
+
* @param filePath - the file, relative to the project root.
|
|
34
|
+
* @param startLine - one-based first line to return.
|
|
35
|
+
* @param endLine - one-based last line to return.
|
|
36
|
+
* @param limits - the caps applied to the returned text.
|
|
37
|
+
* @param signal - aborts the read.
|
|
38
|
+
* @returns the slice, with `code: null` when the file is unreadable.
|
|
39
|
+
*/
|
|
40
|
+
export declare function readSlice(ctx: Context, projectRoot: string, filePath: string, startLine: number, endLine: number, limits: SourceLimits, signal?: AbortSignal): Promise<SourceSlice>;
|
|
41
|
+
//# sourceMappingURL=source.d.ts.map
|
package/lib/source.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source retrieval for the operations that return code. Reads go through `ctx.fs`, never
|
|
3
|
+
* `node:fs`: the filesystem seam is what resolves a path against the session workspace, enforces
|
|
4
|
+
* read policy, and reaches a remote sandbox, so a tool that opened files directly would bypass all
|
|
5
|
+
* three for the one operation most likely to touch a file it should not.
|
|
6
|
+
*
|
|
7
|
+
* A read that fails is not an error here. The graph names a file the index recorded, which may since
|
|
8
|
+
* have been renamed or deleted; the honest answer is the symbols with `code: null`, not a failed
|
|
9
|
+
* query.
|
|
10
|
+
* @module @huanlin/dsh-plugin-codegraph-tool/source
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Read a one-based inclusive line range from a project-relative file.
|
|
14
|
+
* @param ctx - the plugin context, whose `fs` performs the read.
|
|
15
|
+
* @param projectRoot - absolute path the file path resolves against.
|
|
16
|
+
* @param filePath - the file, relative to the project root.
|
|
17
|
+
* @param startLine - one-based first line to return.
|
|
18
|
+
* @param endLine - one-based last line to return.
|
|
19
|
+
* @param limits - the caps applied to the returned text.
|
|
20
|
+
* @param signal - aborts the read.
|
|
21
|
+
* @returns the slice, with `code: null` when the file is unreadable.
|
|
22
|
+
*/
|
|
23
|
+
export async function readSlice(ctx, projectRoot, filePath, startLine, endLine, limits, signal) {
|
|
24
|
+
let text;
|
|
25
|
+
try {
|
|
26
|
+
const target = await ctx.fs.resolve(filePath, { cwd: projectRoot, ...signal === undefined ? {} : { signal } });
|
|
27
|
+
text = await ctx.fs.readText(target, signal);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Only the resolve/read pair runs in the try. Every rejection means this file cannot be shown —
|
|
31
|
+
// moved, deleted, binary, or refused by read policy — and the caller reports the symbols
|
|
32
|
+
// without source rather than failing a query that has graph results to return.
|
|
33
|
+
return { code: null, truncated: false };
|
|
34
|
+
}
|
|
35
|
+
const lines = text.split('\n');
|
|
36
|
+
const first = Math.max(1, startLine);
|
|
37
|
+
const last = Math.min(lines.length, Math.max(first, endLine));
|
|
38
|
+
const wanted = lines.slice(first - 1, last);
|
|
39
|
+
const byLines = wanted.slice(0, limits.maxLines);
|
|
40
|
+
const joined = byLines.join('\n');
|
|
41
|
+
const clipped = joined.length <= limits.maxChars ? joined : joined.slice(0, limits.maxChars);
|
|
42
|
+
return {
|
|
43
|
+
code: clipped,
|
|
44
|
+
startLine: first,
|
|
45
|
+
truncated: byLines.length < wanted.length || clipped.length < joined.length,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=source.js.map
|
package/package.json
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@huanlin/dsh-plugin-codegraph-tool",
|
|
3
|
+
"version": "0.1.8",
|
|
4
|
+
"description": "Model-facing codegraph tools for DeepSeek Harness — a read-only codegraph tool with ten structural query operations plus a codegraph_index tool that builds or refreshes the index on its own timeout budget",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"dsh",
|
|
7
|
+
"dsh-plugin",
|
|
8
|
+
"deepseek-harness",
|
|
9
|
+
"cordis",
|
|
10
|
+
"cordis-plugin",
|
|
11
|
+
"codegraph",
|
|
12
|
+
"code-graph",
|
|
13
|
+
"call-graph",
|
|
14
|
+
"code-intelligence",
|
|
15
|
+
"ai-agent",
|
|
16
|
+
"llm-tools",
|
|
17
|
+
"agent-tools"
|
|
18
|
+
],
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"author": "CC ZHAO",
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "git+https://github.com/HuanLinOTO/dsh-plugin-codegraph.git",
|
|
24
|
+
"directory": "packages/tool"
|
|
25
|
+
},
|
|
26
|
+
"homepage": "https://github.com/HuanLinOTO/dsh-plugin-codegraph#readme",
|
|
27
|
+
"bugs": "https://github.com/HuanLinOTO/dsh-plugin-codegraph/issues",
|
|
28
|
+
"type": "module",
|
|
29
|
+
"main": "lib/index.js",
|
|
30
|
+
"types": "lib/index.d.ts",
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"types": "./lib/index.d.ts",
|
|
34
|
+
"default": "./lib/index.js"
|
|
35
|
+
},
|
|
36
|
+
"./package.json": "./package.json"
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"lib/**/*.js",
|
|
40
|
+
"lib/**/*.d.ts"
|
|
41
|
+
],
|
|
42
|
+
"publishConfig": {
|
|
43
|
+
"access": "public"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"@deepseek-ai/schemastery": "^3.18.1",
|
|
47
|
+
"@huanlin/dsh-plugin-codegraph-service": "^0.1.8"
|
|
48
|
+
},
|
|
49
|
+
"peerDependencies": {
|
|
50
|
+
"@deepseek-ai/cordis": ">=4.0.1",
|
|
51
|
+
"@deepseek-ai/dsh-fs": ">=0.1.2-rc.1",
|
|
52
|
+
"@deepseek-ai/dsh-llm": ">=0.1.2-rc.1",
|
|
53
|
+
"@deepseek-ai/dsh-system-prompt": ">=0.1.2-rc.1",
|
|
54
|
+
"@deepseek-ai/dsh-timeout": ">=0.1.0-rc.6",
|
|
55
|
+
"@deepseek-ai/dsh-tools": ">=0.1.2-rc.1",
|
|
56
|
+
"@deepseek-ai/dsh-util-values": ">=0.1.2-rc.1"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@deepseek-ai/cordis": "^4.0.1",
|
|
60
|
+
"@deepseek-ai/dsh-fs": "0.1.2-rc.1",
|
|
61
|
+
"@deepseek-ai/dsh-llm": "0.1.2-rc.1",
|
|
62
|
+
"@deepseek-ai/dsh-system-prompt": "0.1.2-rc.1",
|
|
63
|
+
"@deepseek-ai/dsh-timeout": "0.1.2-rc.1",
|
|
64
|
+
"@deepseek-ai/dsh-tools": "0.1.2-rc.1",
|
|
65
|
+
"@deepseek-ai/dsh-util-values": "0.1.2-rc.1",
|
|
66
|
+
"@huanlin/dsh-plugin-codegraph-sqlite": "^0.1.8",
|
|
67
|
+
"@huanlin/dsh-plugin-codegraph-tree-sitter": "^0.1.8"
|
|
68
|
+
}
|
|
69
|
+
}
|