@lijian-ui/dsh-im-gateway 0.2.1 → 0.2.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/lib/client.js +35 -0
- package/lib/{index-DcKTwqN6.d.ts → index-CM3Kp_qE.d.ts} +2 -0
- package/lib/index.js +42 -10
- package/package.json +108 -108
package/lib/client.js
CHANGED
|
@@ -1304,6 +1304,41 @@ window.__ModuleLoader__.load({
|
|
|
1304
1304
|
t
|
|
1305
1305
|
})
|
|
1306
1306
|
}, ImChannelsSection));
|
|
1307
|
+
const navLabels = /* @__PURE__ */ new Set([zh["section.label"], en["section.label"]]);
|
|
1308
|
+
const imNavSvg = "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" data-imgw-nav=\"1\"><path d=\"M8.3125 0.981587C8.66767 1.0545 8.97902 1.20558 9.2627 1.43374C9.48724 1.61438 9.73029 1.85933 9.97949 2.10854L14.707 6.83608L13.293 8.25014L9 3.95717V15.0431H7V3.95717L2.70703 8.25014L1.29297 6.83608L6.02051 2.10854C6.26971 1.85933 6.51277 1.61438 6.7373 1.43374C6.97662 1.24126 7.28445 1.04542 7.6875 0.981587C7.8973 0.94841 8.1031 0.956564 8.3125 0.981587Z\" fill=\"currentColor\"/></svg>";
|
|
1309
|
+
const patchNavIcon = () => {
|
|
1310
|
+
if (typeof document === "undefined") return;
|
|
1311
|
+
for (const span of Array.from(document.querySelectorAll("button > span"))) {
|
|
1312
|
+
if (!navLabels.has(span.textContent ?? "")) continue;
|
|
1313
|
+
const button = span.parentElement;
|
|
1314
|
+
if (button === null) continue;
|
|
1315
|
+
const stale = button.querySelector("svg:not([data-imgw-nav])");
|
|
1316
|
+
if (stale === null) continue;
|
|
1317
|
+
const template = document.createElement("template");
|
|
1318
|
+
template.innerHTML = imNavSvg;
|
|
1319
|
+
const next = template.content.firstElementChild;
|
|
1320
|
+
if (next === null) continue;
|
|
1321
|
+
const cls = stale.getAttribute("class");
|
|
1322
|
+
if (cls !== null) next.setAttribute("class", cls);
|
|
1323
|
+
stale.replaceWith(next);
|
|
1324
|
+
}
|
|
1325
|
+
};
|
|
1326
|
+
if (typeof document !== "undefined" && typeof MutationObserver !== "undefined" && document.body !== null) {
|
|
1327
|
+
let scheduled = false;
|
|
1328
|
+
const schedule = () => {
|
|
1329
|
+
if (scheduled) return;
|
|
1330
|
+
scheduled = true;
|
|
1331
|
+
queueMicrotask(() => {
|
|
1332
|
+
scheduled = false;
|
|
1333
|
+
patchNavIcon();
|
|
1334
|
+
});
|
|
1335
|
+
};
|
|
1336
|
+
patchNavIcon();
|
|
1337
|
+
new MutationObserver(schedule).observe(document.body, {
|
|
1338
|
+
childList: true,
|
|
1339
|
+
subtree: true
|
|
1340
|
+
});
|
|
1341
|
+
}
|
|
1307
1342
|
}
|
|
1308
1343
|
//#endregion
|
|
1309
1344
|
exports.apply = apply;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Context, Context as Context$1, Service } from "@deepseek-ai/cordis";
|
|
2
2
|
import Schema from "@deepseek-ai/schemastery";
|
|
3
|
+
import { SessionId } from "@deepseek-ai/dsh-session";
|
|
4
|
+
import "@deepseek-ai/dsh-agent";
|
|
3
5
|
import * as _deepseek_ai_cosmokit0 from "@deepseek-ai/cosmokit";
|
|
4
6
|
import { AskUserQuestionAnswer, AskUserQuestionItem } from "@deepseek-ai/dsh-user-questions";
|
|
5
7
|
|
package/lib/index.js
CHANGED
|
@@ -722,8 +722,11 @@ var CommandHandler = class {
|
|
|
722
722
|
this.gw.modelOverrides.delete(currentSessionId);
|
|
723
723
|
this.gw.sessionToConv.delete(currentSessionId);
|
|
724
724
|
}
|
|
725
|
-
const handle = await this.gw.ctx.agents.resume({
|
|
726
|
-
|
|
725
|
+
const handle = await this.gw.ctx.agents.resume({
|
|
726
|
+
resumeSessionId: targetSessionId,
|
|
727
|
+
agentOptions: this.gw.currentModelFor(targetSessionId),
|
|
728
|
+
setup: this.gw.presetSetup(targetSessionId)
|
|
729
|
+
});
|
|
727
730
|
this.gw.agentHandles.set(targetSessionId, handle);
|
|
728
731
|
this.gw.convToSession.set(convKey, targetSessionId);
|
|
729
732
|
this.gw.sessionToConv.set(targetSessionId, convKey);
|
|
@@ -1276,7 +1279,7 @@ const Config = Schema.object({
|
|
|
1276
1279
|
*/
|
|
1277
1280
|
var ImGatewayService = class extends Service {
|
|
1278
1281
|
config;
|
|
1279
|
-
static inject = ["agents"];
|
|
1282
|
+
static inject = ["agents", "agentPresets"];
|
|
1280
1283
|
channels = /* @__PURE__ */ new Map();
|
|
1281
1284
|
convToSession = /* @__PURE__ */ new Map();
|
|
1282
1285
|
sessionToConv = /* @__PURE__ */ new Map();
|
|
@@ -1581,8 +1584,11 @@ var ImGatewayService = class extends Service {
|
|
|
1581
1584
|
if (persistence) {
|
|
1582
1585
|
if ((await persistence.list()).find((header) => header.id === sessionId)) {
|
|
1583
1586
|
console.log(`[im-gateway] ensureSession: branch 2 (resume from persistence)`);
|
|
1584
|
-
const handle = await this.ctx.agents.resume({
|
|
1585
|
-
|
|
1587
|
+
const handle = await this.ctx.agents.resume({
|
|
1588
|
+
resumeSessionId: sessionId,
|
|
1589
|
+
agentOptions: this.currentModelFor(sessionId),
|
|
1590
|
+
setup: this.presetSetup(sessionId)
|
|
1591
|
+
});
|
|
1586
1592
|
this.agentHandles.set(sessionId, handle);
|
|
1587
1593
|
this.convToSession.set(convKey, sessionId);
|
|
1588
1594
|
this.sessionToConv.set(sessionId, convKey);
|
|
@@ -1598,15 +1604,20 @@ var ImGatewayService = class extends Service {
|
|
|
1598
1604
|
try {
|
|
1599
1605
|
handle = await this.ctx.agents.create({
|
|
1600
1606
|
sessionId,
|
|
1601
|
-
meta: { cwd: effectiveCwd }
|
|
1607
|
+
meta: { cwd: effectiveCwd },
|
|
1608
|
+
agentOptions: this.currentModelFor(sessionId),
|
|
1609
|
+
setup: this.presetSetup(sessionId)
|
|
1602
1610
|
});
|
|
1603
1611
|
} catch (err) {
|
|
1604
1612
|
if (isIdCollision(err)) {
|
|
1605
1613
|
console.log(`[im-gateway] ensureSession: id collision, falling back to resume`);
|
|
1606
|
-
handle = await this.ctx.agents.resume({
|
|
1614
|
+
handle = await this.ctx.agents.resume({
|
|
1615
|
+
resumeSessionId: sessionId,
|
|
1616
|
+
agentOptions: this.currentModelFor(sessionId),
|
|
1617
|
+
setup: this.presetSetup(sessionId)
|
|
1618
|
+
});
|
|
1607
1619
|
} else throw err;
|
|
1608
1620
|
}
|
|
1609
|
-
this.installModelSelection(handle.agent, sessionId);
|
|
1610
1621
|
this.agentHandles.set(sessionId, handle);
|
|
1611
1622
|
this.convToSession.set(convKey, sessionId);
|
|
1612
1623
|
this.sessionToConv.set(sessionId, convKey);
|
|
@@ -1712,6 +1723,27 @@ var ImGatewayService = class extends Service {
|
|
|
1712
1723
|
}
|
|
1713
1724
|
} catch {}
|
|
1714
1725
|
}
|
|
1726
|
+
/** Compute the initial model selection for a session (override → global → deployment default). */
|
|
1727
|
+
currentModelFor(sessionId) {
|
|
1728
|
+
const override = this.modelOverrides.get(sessionId) ?? this.globalModelOverride;
|
|
1729
|
+
if (override) return override;
|
|
1730
|
+
return this.ctx.get("agentDefaultModel")?.currentSelection();
|
|
1731
|
+
}
|
|
1732
|
+
/**
|
|
1733
|
+
* Agent setup callback: mount the 'standard' preset (tools, prompt sections,
|
|
1734
|
+
* skills) and install model selection into the agent's prompt assembly.
|
|
1735
|
+
* Called by agents.create/agents.resume BEFORE the agent is published, so
|
|
1736
|
+
* the first prompt assembly has all tools and {{provider}}/{{model}} variables.
|
|
1737
|
+
*/
|
|
1738
|
+
presetSetup(sessionId) {
|
|
1739
|
+
const gateway = this;
|
|
1740
|
+
return async (agentCtx) => {
|
|
1741
|
+
const presets = gateway.ctx.get("agentPresets");
|
|
1742
|
+
if (presets) await presets.mount(agentCtx, "standard");
|
|
1743
|
+
else console.warn("[im-gateway] agentPresets not available, agent will have no tools");
|
|
1744
|
+
gateway.installModelSelection(agentCtx, sessionId);
|
|
1745
|
+
};
|
|
1746
|
+
}
|
|
1715
1747
|
/**
|
|
1716
1748
|
* Wire the agent-default-model selection into one agent's prompt assembly
|
|
1717
1749
|
* (mirrors dsh-host-apiproxy selectionFor). Listeners live on the agent's
|
|
@@ -1724,7 +1756,7 @@ var ImGatewayService = class extends Service {
|
|
|
1724
1756
|
* `modelRefs` so `/model` can mutate `current` on the same object the prompt
|
|
1725
1757
|
* assembly reads.
|
|
1726
1758
|
*/
|
|
1727
|
-
installModelSelection(
|
|
1759
|
+
installModelSelection(agentCtx, sessionId) {
|
|
1728
1760
|
const gateway = this;
|
|
1729
1761
|
const defaults = this.ctx.get("agentDefaultModel");
|
|
1730
1762
|
const ref = {
|
|
@@ -1743,7 +1775,7 @@ var ImGatewayService = class extends Service {
|
|
|
1743
1775
|
},
|
|
1744
1776
|
assembled: void 0
|
|
1745
1777
|
};
|
|
1746
|
-
installModelSelection(
|
|
1778
|
+
installModelSelection(agentCtx, ref);
|
|
1747
1779
|
this.modelRefs.set(sessionId, ref);
|
|
1748
1780
|
}
|
|
1749
1781
|
async runTurn(sessionId, convKey, channel, parts) {
|
package/package.json
CHANGED
|
@@ -1,108 +1,108 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@lijian-ui/dsh-im-gateway",
|
|
3
|
-
"version": "0.2.
|
|
4
|
-
"description": "Multi-channel IM gateway plugin for DeepSeek Harness (dsh): DingTalk / QQ / WeChat(iLink) with QR-scan binding, streaming replies, and a unified ctx.imGateway service. 为 DeepSeek Harness 提供钉钉/QQ/个人微信多 IM 通道接入。",
|
|
5
|
-
"license": "MIT",
|
|
6
|
-
"type": "module",
|
|
7
|
-
"main": "lib/index.js",
|
|
8
|
-
"types": "lib/index.d.ts",
|
|
9
|
-
"exports": {
|
|
10
|
-
".": {
|
|
11
|
-
"types": "./lib/index.d.ts",
|
|
12
|
-
"default": "./lib/index.js"
|
|
13
|
-
},
|
|
14
|
-
"./client": {
|
|
15
|
-
"default": "./lib/client.js"
|
|
16
|
-
},
|
|
17
|
-
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
18
|
-
"./package.json": "./package.json"
|
|
19
|
-
},
|
|
20
|
-
"files": [
|
|
21
|
-
"lib/**/*.js",
|
|
22
|
-
"lib/**/*.d.ts",
|
|
23
|
-
"cordis.patch.yml",
|
|
24
|
-
"README.md",
|
|
25
|
-
"README.en.md",
|
|
26
|
-
"LICENSE"
|
|
27
|
-
],
|
|
28
|
-
"scripts": {
|
|
29
|
-
"build": "tsdown",
|
|
30
|
-
"watch": "tsdown --watch",
|
|
31
|
-
"typecheck": "tsc --noEmit",
|
|
32
|
-
"test": "node --test tests/*.test.mjs",
|
|
33
|
-
"prepare": "npm run build"
|
|
34
|
-
},
|
|
35
|
-
"keywords": [
|
|
36
|
-
"deepseek-harness",
|
|
37
|
-
"dsh",
|
|
38
|
-
"dsh-plugin",
|
|
39
|
-
"im-gateway",
|
|
40
|
-
"dingtalk",
|
|
41
|
-
"qq",
|
|
42
|
-
"wechat",
|
|
43
|
-
"weixin",
|
|
44
|
-
"cordis"
|
|
45
|
-
],
|
|
46
|
-
"repository": {
|
|
47
|
-
"type": "git",
|
|
48
|
-
"url": "git+https://github.com/lijian-ui/dsh-im-gateway.git"
|
|
49
|
-
},
|
|
50
|
-
"dsh": {
|
|
51
|
-
"bundle": {
|
|
52
|
-
"patch": "./cordis.patch.yml"
|
|
53
|
-
},
|
|
54
|
-
"client": {
|
|
55
|
-
"inject": [
|
|
56
|
-
"@deepseek-ai/dsh-client-runtime",
|
|
57
|
-
"@deepseek-ai/dsh-client-locale",
|
|
58
|
-
"@deepseek-ai/dsh-api-gateway"
|
|
59
|
-
],
|
|
60
|
-
"platform": "web",
|
|
61
|
-
"immediately": true
|
|
62
|
-
}
|
|
63
|
-
},
|
|
64
|
-
"peerDependencies": {
|
|
65
|
-
"@deepseek-ai/cordis": "*",
|
|
66
|
-
"@deepseek-ai/schemastery": "*",
|
|
67
|
-
"@deepseek-ai/dsh-agent": "0.1.0-rc.6",
|
|
68
|
-
"@deepseek-ai/dsh-llm": "0.1.0-rc.6",
|
|
69
|
-
"@deepseek-ai/dsh-session": "0.1.0-rc.6",
|
|
70
|
-
"@deepseek-ai/dsh-settings": "*",
|
|
71
|
-
"@deepseek-ai/dsh-typert-protocol": "*",
|
|
72
|
-
"@deepseek-ai/dsh-user-approval": "0.1.0-rc.6",
|
|
73
|
-
"@deepseek-ai/dsh-user-questions": "0.1.0-rc.6"
|
|
74
|
-
},
|
|
75
|
-
"dependencies": {
|
|
76
|
-
"@tencent-connect/qqbot-connector": "^1.2.0",
|
|
77
|
-
"@tencent-connect/qqbot-nodejs": "^1.0.4",
|
|
78
|
-
"dingtalk-stream": "^2.1.5",
|
|
79
|
-
"qrcode": "^1.5.4",
|
|
80
|
-
"ws": "^8.18.0"
|
|
81
|
-
},
|
|
82
|
-
"devDependencies": {
|
|
83
|
-
"@deepseek-ai/cordis": "4.0.1",
|
|
84
|
-
"@deepseek-ai/schemastery": "3.18.1",
|
|
85
|
-
"@deepseek-ai/dsh-agent": "0.1.0-rc.6",
|
|
86
|
-
"@deepseek-ai/dsh-llm": "0.1.0-rc.6",
|
|
87
|
-
"@deepseek-ai/dsh-session": "0.1.0-rc.6",
|
|
88
|
-
"@deepseek-ai/dsh-settings": "0.1.0-rc.6",
|
|
89
|
-
"@deepseek-ai/dsh-typert-protocol": "0.1.0-rc.6",
|
|
90
|
-
"@deepseek-ai/dsh-user-approval": "0.1.0-rc.6",
|
|
91
|
-
"@deepseek-ai/dsh-user-questions": "0.1.0-rc.6",
|
|
92
|
-
"@deepseek-ai/dsh-client-connection": "0.1.0-rc.6",
|
|
93
|
-
"@deepseek-ai/dsh-client-locale": "0.1.0-rc.6",
|
|
94
|
-
"@deepseek-ai/dsh-client-runtime": "0.1.0-rc.6",
|
|
95
|
-
"@deepseek-ai/dsh-client-schema-form": "0.1.0-rc.6",
|
|
96
|
-
"@deepseek-ai/dsh-client-ui-slots": "0.1.0-rc.6",
|
|
97
|
-
"@deepseek-ai/dsh-client-ui-settings": "0.1.0-rc.6",
|
|
98
|
-
"@deepseek-ai/dsh-client-ui-settings-plugins": "0.1.0-rc.6",
|
|
99
|
-
"@deepseek-ai/dsh-api-gateway": "0.1.0-rc.6",
|
|
100
|
-
"@types/node": "^22.0.0",
|
|
101
|
-
"@types/qrcode": "^1.5.5",
|
|
102
|
-
"@types/react": "^18.3.0",
|
|
103
|
-
"@types/ws": "^8.5.0",
|
|
104
|
-
"react": "^18.2.0",
|
|
105
|
-
"tsdown": "^0.12.0",
|
|
106
|
-
"typescript": "^5.6.0"
|
|
107
|
-
}
|
|
108
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@lijian-ui/dsh-im-gateway",
|
|
3
|
+
"version": "0.2.2",
|
|
4
|
+
"description": "Multi-channel IM gateway plugin for DeepSeek Harness (dsh): DingTalk / QQ / WeChat(iLink) with QR-scan binding, streaming replies, and a unified ctx.imGateway service. 为 DeepSeek Harness 提供钉钉/QQ/个人微信多 IM 通道接入。",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "lib/index.js",
|
|
8
|
+
"types": "lib/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./lib/index.d.ts",
|
|
12
|
+
"default": "./lib/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./client": {
|
|
15
|
+
"default": "./lib/client.js"
|
|
16
|
+
},
|
|
17
|
+
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
18
|
+
"./package.json": "./package.json"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"lib/**/*.js",
|
|
22
|
+
"lib/**/*.d.ts",
|
|
23
|
+
"cordis.patch.yml",
|
|
24
|
+
"README.md",
|
|
25
|
+
"README.en.md",
|
|
26
|
+
"LICENSE"
|
|
27
|
+
],
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsdown",
|
|
30
|
+
"watch": "tsdown --watch",
|
|
31
|
+
"typecheck": "tsc --noEmit",
|
|
32
|
+
"test": "node --test tests/*.test.mjs",
|
|
33
|
+
"prepare": "npm run build"
|
|
34
|
+
},
|
|
35
|
+
"keywords": [
|
|
36
|
+
"deepseek-harness",
|
|
37
|
+
"dsh",
|
|
38
|
+
"dsh-plugin",
|
|
39
|
+
"im-gateway",
|
|
40
|
+
"dingtalk",
|
|
41
|
+
"qq",
|
|
42
|
+
"wechat",
|
|
43
|
+
"weixin",
|
|
44
|
+
"cordis"
|
|
45
|
+
],
|
|
46
|
+
"repository": {
|
|
47
|
+
"type": "git",
|
|
48
|
+
"url": "git+https://github.com/lijian-ui/dsh-im-gateway.git"
|
|
49
|
+
},
|
|
50
|
+
"dsh": {
|
|
51
|
+
"bundle": {
|
|
52
|
+
"patch": "./cordis.patch.yml"
|
|
53
|
+
},
|
|
54
|
+
"client": {
|
|
55
|
+
"inject": [
|
|
56
|
+
"@deepseek-ai/dsh-client-runtime",
|
|
57
|
+
"@deepseek-ai/dsh-client-locale",
|
|
58
|
+
"@deepseek-ai/dsh-api-gateway"
|
|
59
|
+
],
|
|
60
|
+
"platform": "web",
|
|
61
|
+
"immediately": true
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"peerDependencies": {
|
|
65
|
+
"@deepseek-ai/cordis": "*",
|
|
66
|
+
"@deepseek-ai/schemastery": "*",
|
|
67
|
+
"@deepseek-ai/dsh-agent": "0.1.0-rc.6",
|
|
68
|
+
"@deepseek-ai/dsh-llm": "0.1.0-rc.6",
|
|
69
|
+
"@deepseek-ai/dsh-session": "0.1.0-rc.6",
|
|
70
|
+
"@deepseek-ai/dsh-settings": "*",
|
|
71
|
+
"@deepseek-ai/dsh-typert-protocol": "*",
|
|
72
|
+
"@deepseek-ai/dsh-user-approval": "0.1.0-rc.6",
|
|
73
|
+
"@deepseek-ai/dsh-user-questions": "0.1.0-rc.6"
|
|
74
|
+
},
|
|
75
|
+
"dependencies": {
|
|
76
|
+
"@tencent-connect/qqbot-connector": "^1.2.0",
|
|
77
|
+
"@tencent-connect/qqbot-nodejs": "^1.0.4",
|
|
78
|
+
"dingtalk-stream": "^2.1.5",
|
|
79
|
+
"qrcode": "^1.5.4",
|
|
80
|
+
"ws": "^8.18.0"
|
|
81
|
+
},
|
|
82
|
+
"devDependencies": {
|
|
83
|
+
"@deepseek-ai/cordis": "4.0.1",
|
|
84
|
+
"@deepseek-ai/schemastery": "3.18.1",
|
|
85
|
+
"@deepseek-ai/dsh-agent": "0.1.0-rc.6",
|
|
86
|
+
"@deepseek-ai/dsh-llm": "0.1.0-rc.6",
|
|
87
|
+
"@deepseek-ai/dsh-session": "0.1.0-rc.6",
|
|
88
|
+
"@deepseek-ai/dsh-settings": "0.1.0-rc.6",
|
|
89
|
+
"@deepseek-ai/dsh-typert-protocol": "0.1.0-rc.6",
|
|
90
|
+
"@deepseek-ai/dsh-user-approval": "0.1.0-rc.6",
|
|
91
|
+
"@deepseek-ai/dsh-user-questions": "0.1.0-rc.6",
|
|
92
|
+
"@deepseek-ai/dsh-client-connection": "0.1.0-rc.6",
|
|
93
|
+
"@deepseek-ai/dsh-client-locale": "0.1.0-rc.6",
|
|
94
|
+
"@deepseek-ai/dsh-client-runtime": "0.1.0-rc.6",
|
|
95
|
+
"@deepseek-ai/dsh-client-schema-form": "0.1.0-rc.6",
|
|
96
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.1.0-rc.6",
|
|
97
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.1.0-rc.6",
|
|
98
|
+
"@deepseek-ai/dsh-client-ui-settings-plugins": "0.1.0-rc.6",
|
|
99
|
+
"@deepseek-ai/dsh-api-gateway": "0.1.0-rc.6",
|
|
100
|
+
"@types/node": "^22.0.0",
|
|
101
|
+
"@types/qrcode": "^1.5.5",
|
|
102
|
+
"@types/react": "^18.3.0",
|
|
103
|
+
"@types/ws": "^8.5.0",
|
|
104
|
+
"react": "^18.2.0",
|
|
105
|
+
"tsdown": "^0.12.0",
|
|
106
|
+
"typescript": "^5.6.0"
|
|
107
|
+
}
|
|
108
|
+
}
|