dsh-connect 0.9.0 → 0.9.2
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 +2 -2
- package/README.md +119 -18
- package/README.zh.md +87 -13
- package/client/client.js +18 -15
- package/client/client.js.map +2 -2
- package/client/settings-client.mjs +22 -13
- package/lib/channels/dingtalk/index.d.ts +49 -49
- package/lib/channels/dingtalk/index.d.ts.map +1 -1
- package/lib/channels/feishu/adapter.d.ts +8 -1
- package/lib/channels/feishu/adapter.d.ts.map +1 -1
- package/lib/channels/feishu/adapter.js +120 -39
- package/lib/channels/feishu/adapter.js.map +1 -1
- package/lib/channels/feishu/index.d.ts +27 -27
- package/lib/channels/feishu/index.d.ts.map +1 -1
- package/lib/channels/telegram/index.d.ts +13 -13
- package/lib/channels/telegram/index.d.ts.map +1 -1
- package/lib/channels/web/adapter.d.ts +3 -1
- package/lib/channels/web/adapter.d.ts.map +1 -1
- package/lib/channels/web/adapter.js +3 -1
- package/lib/channels/web/adapter.js.map +1 -1
- package/lib/channels/web/index.d.ts +5 -5
- package/lib/channels/web/index.d.ts.map +1 -1
- package/lib/index.d.ts +42 -58
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +162 -57
- package/lib/index.js.map +1 -1
- package/lib/interaction.d.ts +90 -50
- package/lib/interaction.d.ts.map +1 -1
- package/lib/interaction.js +233 -272
- package/lib/interaction.js.map +1 -1
- package/lib/retry.d.ts.map +1 -1
- package/lib/retry.js +7 -1
- package/lib/retry.js.map +1 -1
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js +0 -2
- package/lib/service.js.map +1 -1
- package/lib/settings/legacy-import.d.ts +190 -0
- package/lib/settings/legacy-import.d.ts.map +1 -0
- package/lib/settings/legacy-import.js +373 -0
- package/lib/settings/legacy-import.js.map +1 -0
- package/lib/settings/namespace.d.ts +204 -116
- package/lib/settings/namespace.d.ts.map +1 -1
- package/lib/settings/namespace.js +235 -148
- package/lib/settings/namespace.js.map +1 -1
- package/lib/settings/settings-model.d.ts.map +1 -1
- package/lib/settings/settings-model.js +10 -1
- package/lib/settings/settings-model.js.map +1 -1
- package/lib/settings/settings-service.d.ts +13 -0
- package/lib/settings/settings-service.d.ts.map +1 -1
- package/lib/settings/settings-service.js +73 -4
- package/lib/settings/settings-service.js.map +1 -1
- package/lib/types.d.ts +14 -1
- package/lib/types.d.ts.map +1 -1
- package/package.json +12 -11
|
@@ -10,8 +10,9 @@
|
|
|
10
10
|
* **Two data planes, one interface.** When the `dsh-connect` settings namespace
|
|
11
11
|
* is installed (`namespace.ts`), that *is* the store: reads come from the
|
|
12
12
|
* provider's resolved section and writes go back through it, which is what makes
|
|
13
|
-
* a pane save land in
|
|
14
|
-
*
|
|
13
|
+
* a pane save land in this plugin's entry in the active profile patch
|
|
14
|
+
* (`cordis.patch.yml`), take effect immediately (the namespace's `onChange`
|
|
15
|
+
* reconciles the running adapters) and survive a restart.
|
|
15
16
|
* The JSON state file is the fallback for hosts without a settings service, and
|
|
16
17
|
* is written only when no namespace is live.
|
|
17
18
|
*
|
|
@@ -26,6 +27,47 @@ function logError(msg) {
|
|
|
26
27
|
if (typeof console !== "undefined")
|
|
27
28
|
console.error?.("[dsh-connect/settings] " + msg);
|
|
28
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Drop per-channel secret keys before a config leaves the host.
|
|
32
|
+
*
|
|
33
|
+
* Applied in `snapshot`, which is the one boundary every read crosses, so both
|
|
34
|
+
* data planes are covered and neither has to remember: the live plane's resolved
|
|
35
|
+
* section is *allowed* to carry a secret the user wrote by hand (the documented
|
|
36
|
+
* posture for the plugin entry, and what the deployed profile does), and the
|
|
37
|
+
* fallback file is plaintext besides. It costs the pane nothing to lose them —
|
|
38
|
+
* the config plane is not where a secret is displayed; the pane renders
|
|
39
|
+
* `secrets`/`secretPreviews`, which come from the credential store and are
|
|
40
|
+
* masked there.
|
|
41
|
+
*
|
|
42
|
+
* It also keeps them out of the *write* path: `snapshotToForm` carries the
|
|
43
|
+
* config into the form and `buildConfigSave` re-emits whatever keys it finds
|
|
44
|
+
* there, so an unfiltered read could hand a hand-written secret straight back to
|
|
45
|
+
* the server inside the next save payload.
|
|
46
|
+
*
|
|
47
|
+
* Only these keys go: a plane is a loose store rather than the declared schema,
|
|
48
|
+
* and a save can carry keys the pane does not render (the shared config's
|
|
49
|
+
* `language`, a hand-written key), so everything else has to survive the read.
|
|
50
|
+
* Nothing is removed from the document — this filters on the way out, and the
|
|
51
|
+
* service never writes a read back.
|
|
52
|
+
*/
|
|
53
|
+
function withoutSecrets(config) {
|
|
54
|
+
const out = { ...config };
|
|
55
|
+
for (const [channel, keys] of Object.entries(CHANNEL_SECRET_KEYS)) {
|
|
56
|
+
const block = out[channel];
|
|
57
|
+
if (block === null || typeof block !== "object" || Array.isArray(block))
|
|
58
|
+
continue;
|
|
59
|
+
const secretKeys = Object.keys(keys ?? {});
|
|
60
|
+
if (secretKeys.length === 0)
|
|
61
|
+
continue;
|
|
62
|
+
const kept = {};
|
|
63
|
+
for (const [key, value] of Object.entries(block)) {
|
|
64
|
+
if (!secretKeys.includes(key))
|
|
65
|
+
kept[key] = value;
|
|
66
|
+
}
|
|
67
|
+
out[channel] = kept;
|
|
68
|
+
}
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
29
71
|
/**
|
|
30
72
|
* Build a settings service backed by a JSON state file. `get`/`status` read the
|
|
31
73
|
* current state; `save` merges and persists. A missing/corrupt state file is
|
|
@@ -67,7 +109,9 @@ export function createSettingsService(options = {}) {
|
|
|
67
109
|
return { ...initialConfig };
|
|
68
110
|
try {
|
|
69
111
|
const value = JSON.parse(readFileSync(statePath, "utf8"));
|
|
70
|
-
return value && typeof value === "object" && !Array.isArray(value)
|
|
112
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
113
|
+
? value
|
|
114
|
+
: {};
|
|
71
115
|
}
|
|
72
116
|
catch (error) {
|
|
73
117
|
log(`failed to read settings state: ${String(error)}`);
|
|
@@ -75,6 +119,7 @@ export function createSettingsService(options = {}) {
|
|
|
75
119
|
}
|
|
76
120
|
}
|
|
77
121
|
function persist(config) {
|
|
122
|
+
// No path is the documented in-memory mode, not a failed write.
|
|
78
123
|
if (!statePath)
|
|
79
124
|
return;
|
|
80
125
|
try {
|
|
@@ -82,10 +127,22 @@ export function createSettingsService(options = {}) {
|
|
|
82
127
|
writeFileSync(statePath, JSON.stringify(config, null, 2) + "\n");
|
|
83
128
|
}
|
|
84
129
|
catch (error) {
|
|
130
|
+
// Swallowing here was a lie with a delay on it: `save()` goes on to
|
|
131
|
+
// return a snapshot of the value it just failed to store, the pane reads
|
|
132
|
+
// that as 「已保存」, and the setting is gone at the next restart. The
|
|
133
|
+
// code is forwarded verbatim to the browser (`PUBLIC_ERRORS`), so the
|
|
134
|
+
// pane's own failure path can report it instead.
|
|
85
135
|
log(`failed to write settings state: ${String(error)}`);
|
|
136
|
+
const err = new Error("save-failed");
|
|
137
|
+
err.code = "save-failed";
|
|
138
|
+
throw err;
|
|
86
139
|
}
|
|
87
140
|
}
|
|
88
|
-
async function snapshot(
|
|
141
|
+
async function snapshot(rawConfig) {
|
|
142
|
+
// The one boundary every read crosses — `get`, `status`, both save paths —
|
|
143
|
+
// so the secret filter belongs here and not in each read (see
|
|
144
|
+
// `withoutSecrets`).
|
|
145
|
+
const config = withoutSecrets(rawConfig);
|
|
89
146
|
const enabled = (Array.isArray(config.channels) ? config.channels : [...channels])
|
|
90
147
|
.filter((name) => channels.includes(name));
|
|
91
148
|
const credentials = {};
|
|
@@ -149,6 +206,18 @@ export function createSettingsService(options = {}) {
|
|
|
149
206
|
throw err;
|
|
150
207
|
}
|
|
151
208
|
await credentialStore.save(channel, refValues);
|
|
209
|
+
// The adapters are holding the previous secret; hand them the new one
|
|
210
|
+
// before answering the pane (see `onCredentialsSaved`).
|
|
211
|
+
if (options.onCredentialsSaved) {
|
|
212
|
+
try {
|
|
213
|
+
options.onCredentialsSaved();
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
// The credential *is* stored — a failure to re-apply must not be
|
|
217
|
+
// reported as a failed save.
|
|
218
|
+
log(`credential store updated but the channel reconcile failed: ${String(error)}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
152
221
|
return snapshot(readConfig());
|
|
153
222
|
},
|
|
154
223
|
async save(config) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-service.js","sourceRoot":"","sources":["../../src/settings/settings-service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"settings-service.js","sourceRoot":"","sources":["../../src/settings/settings-service.ts"],"names":[],"mappings":"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"}
|
package/lib/types.d.ts
CHANGED
|
@@ -119,6 +119,15 @@ export interface AsyncQueue<T> extends AsyncIterable<T> {
|
|
|
119
119
|
*/
|
|
120
120
|
export interface ChannelAdapter {
|
|
121
121
|
readonly id: string;
|
|
122
|
+
/**
|
|
123
|
+
* Whether this channel can actually present an interactive prompt. Defaults
|
|
124
|
+
* to `true` when omitted. A mirror/observer channel (`web`) has no inbound
|
|
125
|
+
* face of its own, so its `promptChoice` is a no-op that can never report a
|
|
126
|
+
* tap — it sets this to `false` so the interaction bridge leaves the request
|
|
127
|
+
* to whichever client *can* show it instead of spinning on a card nobody
|
|
128
|
+
* will ever see.
|
|
129
|
+
*/
|
|
130
|
+
readonly supportsChoices?: boolean;
|
|
122
131
|
/** Establish the long-connection / subscription; must be reconnect-safe. */
|
|
123
132
|
start(): Promise<void>;
|
|
124
133
|
stop(): Promise<void>;
|
|
@@ -144,8 +153,12 @@ export interface ChannelAdapter {
|
|
|
144
153
|
* reuse that card (replace its content in place) instead of sending a new one —
|
|
145
154
|
* this is what lets a menu chain navigate on a single card. Resolves with the
|
|
146
155
|
* picked option id (or `undefined` on dismiss/timeout) plus the card message id.
|
|
156
|
+
*
|
|
157
|
+
* When `signal` aborts, the prompt must retire immediately: resolve with
|
|
158
|
+
* `{ choice: undefined }` and stop accepting taps, leaving the card for the
|
|
159
|
+
* caller to replace or close. Adapters that cannot be cancelled ignore it.
|
|
147
160
|
*/
|
|
148
|
-
promptChoice(target: OutboundTarget, prompt: ChoicePrompt, updateMessageId?: string): Promise<ChoiceResult>;
|
|
161
|
+
promptChoice(target: OutboundTarget, prompt: ChoicePrompt, updateMessageId?: string, signal?: AbortSignal): Promise<ChoiceResult>;
|
|
149
162
|
/** Replace a menu card with a completion notice (closes the interaction). */
|
|
150
163
|
closeMenu(messageId: string, summary: string): Promise<void>;
|
|
151
164
|
/** Register the inbound handler; called for every normalized message. */
|
package/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,+DAA+D;AAC/D,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;AAEvC,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,gDAAgD;IAChD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,sEAAsE;IACtE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,sFAAsF;IACtF,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,+FAA+F;IAC/F,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,4EAA4E;IAC5E,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,qFAAqF;IACrF,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,8DAA8D;AAC9D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,6DAA6D;AAC7D,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,iFAAiF;AACjF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,8DAA8D;IAC9D,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,6EAA6E;IAC7E,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,mDAAmD;AACnD,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;AAE3D,8EAA8E;AAC9E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IAC1C,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC7C,4DAA4D;IAC5D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,0FAA0F;IAC1F,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAC/B,0EAA0E;IAC1E,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,oFAAoF;AACpF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,mFAAmF;IACnF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,+BAA+B;AAC/B,MAAM,MAAM,UAAU,GAClB,WAAW,GACX,SAAS,GACT,SAAS,GACT,OAAO,GACP,YAAY,GACZ,aAAa,GACb,SAAS,CAAC;AAEd,yCAAyC;AACzC,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,iDAAiD;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,2CAA2C;IAC3C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,+CAA+C;IAC/C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,wEAAwE;IACxE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,yEAAyE;IACzE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,4CAA4C;IAC5C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,+EAA+E;AAC/E,MAAM,WAAW,UAAU,CAAC,CAAC,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACrB,GAAG,IAAI,IAAI,CAAC;CACb;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,4EAA4E;IAC5E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE;;;;OAIG;IACH,QAAQ,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpG;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF;;;;;;;;;OASG;IACH,YAAY,CACV,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,YAAY,EACpB,eAAe,CAAC,EAAE,MAAM,EACxB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC,CAAC;IACzB,6EAA6E;IAC7E,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,yEAAyE;IACzE,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACzE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-connect",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.2",
|
|
4
4
|
"description": "All-in-one DeepSeek Harness (DSH) chat bridge: one plugin, one config block — Feishu/Lark, Telegram, DingTalk, and Web mirror adapters plus the web-settings pane, all behind a channels[] selector",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -93,22 +93,23 @@
|
|
|
93
93
|
"prepack": "tsc -p tsconfig.json && node scripts/build-client.mjs"
|
|
94
94
|
},
|
|
95
95
|
"dependencies": {
|
|
96
|
-
"@deepseek-ai/schemastery": "^3.18.
|
|
97
|
-
"@larksuiteoapi/node-sdk": "^1.73.0"
|
|
96
|
+
"@deepseek-ai/schemastery": "^3.18.4",
|
|
97
|
+
"@larksuiteoapi/node-sdk": "^1.73.0",
|
|
98
|
+
"yaml": "^2.8.1"
|
|
98
99
|
},
|
|
99
100
|
"peerDependencies": {
|
|
100
101
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
101
|
-
"@deepseek-ai/dsh-agent": "^0.
|
|
102
|
-
"@deepseek-ai/dsh-llm": "^0.
|
|
103
|
-
"@deepseek-ai/dsh-session": "^0.
|
|
102
|
+
"@deepseek-ai/dsh-agent": "^0.2.0-rc.2",
|
|
103
|
+
"@deepseek-ai/dsh-llm": "^0.2.0-rc.2",
|
|
104
|
+
"@deepseek-ai/dsh-session": "^0.2.0-rc.2"
|
|
104
105
|
},
|
|
105
106
|
"devDependencies": {
|
|
106
107
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
107
|
-
"@deepseek-ai/dsh-agent": "^0.
|
|
108
|
-
"@deepseek-ai/dsh-llm": "^0.
|
|
109
|
-
"@deepseek-ai/dsh-scope": "^0.
|
|
110
|
-
"@deepseek-ai/dsh-session": "^0.
|
|
111
|
-
"@deepseek-ai/dsh-tool-todo": "^0.
|
|
108
|
+
"@deepseek-ai/dsh-agent": "^0.2.0-rc.2",
|
|
109
|
+
"@deepseek-ai/dsh-llm": "^0.2.0-rc.2",
|
|
110
|
+
"@deepseek-ai/dsh-scope": "^0.2.0-rc.2",
|
|
111
|
+
"@deepseek-ai/dsh-session": "^0.2.0-rc.2",
|
|
112
|
+
"@deepseek-ai/dsh-tool-todo": "^0.2.0-rc.2",
|
|
112
113
|
"@types/node": "^22.15.0",
|
|
113
114
|
"esbuild": "^0.28.2",
|
|
114
115
|
"typescript": "^5.6.3"
|