@aipanel/provider-deepseek 1.2.0-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/es/api.d.ts +36 -0
- package/es/api.js +196 -0
- package/es/bridge-script.d.ts +11 -0
- package/es/bridge-script.js +142 -0
- package/es/constants.d.ts +25 -0
- package/es/constants.js +23 -0
- package/es/deepseek-web.d.ts +21 -0
- package/es/deepseek-web.js +62 -0
- package/es/dsh-install.d.ts +16 -0
- package/es/dsh-install.js +58 -0
- package/es/index.d.ts +16 -0
- package/es/index.js +29 -0
- package/es/profile.d.ts +11 -0
- package/es/profile.js +57 -0
- package/es/provider.d.ts +49 -0
- package/es/provider.js +290 -0
- package/es/system.d.ts +3 -0
- package/es/system.js +170 -0
- package/es/types.d.ts +127 -0
- package/es/types.js +19 -0
- package/lib/api.cjs +228 -0
- package/lib/api.d.ts +36 -0
- package/lib/bridge-script.cjs +165 -0
- package/lib/bridge-script.d.ts +11 -0
- package/lib/constants.cjs +52 -0
- package/lib/constants.d.ts +25 -0
- package/lib/deepseek-web.cjs +85 -0
- package/lib/deepseek-web.d.ts +21 -0
- package/lib/dsh-install.cjs +95 -0
- package/lib/dsh-install.d.ts +16 -0
- package/lib/index.cjs +63 -0
- package/lib/index.d.ts +16 -0
- package/lib/profile.cjs +91 -0
- package/lib/profile.d.ts +11 -0
- package/lib/provider.cjs +308 -0
- package/lib/provider.d.ts +49 -0
- package/lib/system.cjs +195 -0
- package/lib/system.d.ts +3 -0
- package/lib/types.cjs +42 -0
- package/lib/types.d.ts +127 -0
- package/package.json +34 -0
package/lib/system.cjs
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var system_exports = {};
|
|
19
|
+
__export(system_exports, {
|
|
20
|
+
checkDeepSeekInstalled: () => checkDeepSeekInstalled,
|
|
21
|
+
getDeepSeekVersion: () => getDeepSeekVersion,
|
|
22
|
+
killOrphanDeepSeekProcesses: () => killOrphanDeepSeekProcesses
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(system_exports);
|
|
25
|
+
var import_child_process = require("child_process");
|
|
26
|
+
var import_node = require("@aipanel/core/node");
|
|
27
|
+
const log = (0, import_node.createLogger)("DeepSeekSystem");
|
|
28
|
+
async function checkDeepSeekInstalled() {
|
|
29
|
+
const timer = log.timer("checkDeepSeekInstalled");
|
|
30
|
+
return new Promise((resolve) => {
|
|
31
|
+
log.debug("Checking if dsh is installed...");
|
|
32
|
+
const proc = (0, import_child_process.spawn)("dsh", ["--version"], { stdio: "ignore", shell: true });
|
|
33
|
+
proc.on("close", (code) => {
|
|
34
|
+
const installed = code === 0;
|
|
35
|
+
timer.end(installed ? "\u2713 dsh is installed" : "\u274C dsh not found");
|
|
36
|
+
resolve(installed);
|
|
37
|
+
});
|
|
38
|
+
proc.on("error", (err) => {
|
|
39
|
+
log.debug("Failed to check dsh installation", { error: err.message });
|
|
40
|
+
timer.end("\u274C Check failed");
|
|
41
|
+
resolve(false);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function getDeepSeekVersion() {
|
|
46
|
+
return new Promise((resolve) => {
|
|
47
|
+
const proc = (0, import_child_process.spawn)("dsh", ["--version"], { stdio: "pipe", shell: true });
|
|
48
|
+
let output = "";
|
|
49
|
+
proc.stdout?.on("data", (data) => {
|
|
50
|
+
output += data.toString();
|
|
51
|
+
});
|
|
52
|
+
proc.on("close", (code) => {
|
|
53
|
+
if (code === 0 && output.trim()) {
|
|
54
|
+
resolve(output.trim());
|
|
55
|
+
} else {
|
|
56
|
+
resolve(null);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
proc.on("error", () => {
|
|
60
|
+
resolve(null);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
const KILL_ORPHAN_TIMEOUT = 5e3;
|
|
65
|
+
async function killOrphanDeepSeekProcesses() {
|
|
66
|
+
const timer = log.timer("killOrphanDeepSeekProcesses");
|
|
67
|
+
log.debug("Looking for orphan dsh processes (PPID=1)");
|
|
68
|
+
return new Promise((resolve) => {
|
|
69
|
+
let settled = false;
|
|
70
|
+
const done = (count) => {
|
|
71
|
+
if (settled) return;
|
|
72
|
+
settled = true;
|
|
73
|
+
resolve(count);
|
|
74
|
+
};
|
|
75
|
+
const timeout = setTimeout(() => {
|
|
76
|
+
log.warn("Kill orphan processes timed out, skipping");
|
|
77
|
+
timer.end("\u26A0 Timeout, skipped");
|
|
78
|
+
done(0);
|
|
79
|
+
}, KILL_ORPHAN_TIMEOUT);
|
|
80
|
+
const wrappedResolve = (count) => {
|
|
81
|
+
clearTimeout(timeout);
|
|
82
|
+
done(count);
|
|
83
|
+
};
|
|
84
|
+
if (process.platform === "win32") {
|
|
85
|
+
killOrphanProcessesOnWindows(wrappedResolve, timer);
|
|
86
|
+
} else {
|
|
87
|
+
killOrphanProcessesOnUnix(wrappedResolve, timer);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function killOrphanProcessesOnWindows(resolve, timer) {
|
|
92
|
+
log.debug("Using Windows method to find orphan processes");
|
|
93
|
+
const proc = (0, import_child_process.spawn)(
|
|
94
|
+
"wmic",
|
|
95
|
+
["process", "where", 'name="node.exe"', "get", "processid,parentprocessid,commandline"],
|
|
96
|
+
{ stdio: "pipe" }
|
|
97
|
+
);
|
|
98
|
+
let output = "";
|
|
99
|
+
proc.stdout?.on("data", (data) => {
|
|
100
|
+
output += data.toString();
|
|
101
|
+
});
|
|
102
|
+
proc.on("close", () => {
|
|
103
|
+
const pidsToKill = [];
|
|
104
|
+
output.split("\n").forEach((rawLine) => {
|
|
105
|
+
const line = rawLine.trim();
|
|
106
|
+
if (!line.includes("dsh")) return;
|
|
107
|
+
const parts = line.trim().split(/\s+/);
|
|
108
|
+
if (parts.length >= 2) {
|
|
109
|
+
const ppid = parts[0];
|
|
110
|
+
const pid = parts[1];
|
|
111
|
+
if (ppid === "1" && pid && !isNaN(Number(pid))) {
|
|
112
|
+
pidsToKill.push(pid);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
if (pidsToKill.length > 0) {
|
|
117
|
+
log.debug(`Found ${pidsToKill.length} orphan processes`, { pids: pidsToKill });
|
|
118
|
+
let killedCount = 0;
|
|
119
|
+
let completedCount = 0;
|
|
120
|
+
pidsToKill.forEach((pid) => {
|
|
121
|
+
const killProc = (0, import_child_process.spawn)("taskkill", ["/F", "/PID", pid], { stdio: "ignore" });
|
|
122
|
+
killProc.on("close", (code) => {
|
|
123
|
+
completedCount++;
|
|
124
|
+
if (code === 0) killedCount++;
|
|
125
|
+
if (completedCount === pidsToKill.length) {
|
|
126
|
+
timer.end(`\u2713 Killed ${killedCount} orphan processes`);
|
|
127
|
+
resolve(killedCount);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
} else {
|
|
132
|
+
log.debug("No orphan processes found");
|
|
133
|
+
timer.end("No orphan processes found");
|
|
134
|
+
resolve(0);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
proc.on("error", (err) => {
|
|
138
|
+
log.debug("Failed to find orphan processes", { error: err.message });
|
|
139
|
+
timer.end("\u274C Failed to find orphan processes");
|
|
140
|
+
resolve(0);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
function killOrphanProcessesOnUnix(resolve, timer) {
|
|
144
|
+
log.debug("Using Unix method to find orphan processes");
|
|
145
|
+
const proc = (0, import_child_process.spawn)("ps", ["-e", "-o", "pid,ppid,args"], { stdio: "pipe" });
|
|
146
|
+
let output = "";
|
|
147
|
+
proc.stdout?.on("data", (data) => {
|
|
148
|
+
output += data.toString();
|
|
149
|
+
});
|
|
150
|
+
proc.on("close", () => {
|
|
151
|
+
const lines = output.split("\n");
|
|
152
|
+
const pidsToKill = [];
|
|
153
|
+
lines.forEach((line) => {
|
|
154
|
+
if (!line.includes("dsh")) return;
|
|
155
|
+
const parts = line.trim().split(/\s+/);
|
|
156
|
+
if (parts.length >= 3) {
|
|
157
|
+
const pid = parts[0];
|
|
158
|
+
const ppid = parts[1];
|
|
159
|
+
if (ppid === "1") {
|
|
160
|
+
pidsToKill.push(pid);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
if (pidsToKill.length > 0) {
|
|
165
|
+
log.debug(`Found ${pidsToKill.length} orphan processes`, { pids: pidsToKill });
|
|
166
|
+
const killProc = (0, import_child_process.spawn)("kill", ["-9", ...pidsToKill], { stdio: "ignore" });
|
|
167
|
+
killProc.on("close", (code) => {
|
|
168
|
+
const killedCount = code === 0 ? pidsToKill.length : 0;
|
|
169
|
+
timer.end(
|
|
170
|
+
killedCount > 0 ? `\u2713 Killed ${killedCount} orphan processes` : "\u274C Failed to kill processes"
|
|
171
|
+
);
|
|
172
|
+
resolve(killedCount);
|
|
173
|
+
});
|
|
174
|
+
killProc.on("error", () => {
|
|
175
|
+
timer.end("\u274C Failed to kill processes");
|
|
176
|
+
resolve(0);
|
|
177
|
+
});
|
|
178
|
+
} else {
|
|
179
|
+
log.debug("No orphan processes found");
|
|
180
|
+
timer.end("No orphan processes found");
|
|
181
|
+
resolve(0);
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
proc.on("error", (err) => {
|
|
185
|
+
log.debug("Failed to find orphan processes", { error: err.message });
|
|
186
|
+
timer.end("\u274C Failed to find orphan processes");
|
|
187
|
+
resolve(0);
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
191
|
+
0 && (module.exports = {
|
|
192
|
+
checkDeepSeekInstalled,
|
|
193
|
+
getDeepSeekVersion,
|
|
194
|
+
killOrphanDeepSeekProcesses
|
|
195
|
+
});
|
package/lib/system.d.ts
ADDED
package/lib/types.cjs
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var types_exports = {};
|
|
19
|
+
__export(types_exports, {
|
|
20
|
+
SESSION_EVENT_TYPES: () => SESSION_EVENT_TYPES
|
|
21
|
+
});
|
|
22
|
+
module.exports = __toCommonJS(types_exports);
|
|
23
|
+
const SESSION_EVENT_TYPES = {
|
|
24
|
+
/** 回合开始 → 视为 streaming */
|
|
25
|
+
TURN_START: "turn/start",
|
|
26
|
+
/** 回合结束(稳定停等) */
|
|
27
|
+
TURN_END: "turn/end",
|
|
28
|
+
/** 步骤开始 */
|
|
29
|
+
STEP_START: "step/start",
|
|
30
|
+
/** 步骤结束 */
|
|
31
|
+
STEP_END: "step/end",
|
|
32
|
+
/** 助手输出完成 */
|
|
33
|
+
ASSISTANT_MESSAGE: "assistant/message",
|
|
34
|
+
/** 助手输出增量分片 */
|
|
35
|
+
ASSISTANT_CHUNK: "assistant/chunk",
|
|
36
|
+
/** 思考增量分片 */
|
|
37
|
+
THINKING_DELTA: "thinking/delta"
|
|
38
|
+
};
|
|
39
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
40
|
+
0 && (module.exports = {
|
|
41
|
+
SESSION_EVENT_TYPES
|
|
42
|
+
});
|
package/lib/types.d.ts
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DeepSeek Harness Provider 专属类型
|
|
3
|
+
* 所有与 DeepSeek Harness (dsh) 绑定的类型自包含于此,核心层不感知。
|
|
4
|
+
*/
|
|
5
|
+
/** 权限预设(对应 dsh settings permission.defaultPreset) */
|
|
6
|
+
export type DeepSeekPermissionPreset = "read-only" | "workspace-write" | "danger-full-access";
|
|
7
|
+
/** 繁忙时 Enter 键行为(对应 dsh settings ui-conversation.busyEnter) */
|
|
8
|
+
export type DeepSeekBusyEnter = "queue" | "steer";
|
|
9
|
+
/**
|
|
10
|
+
* DeepSeek Provider 专属配置(对应插件配置的 providerOptions 段)
|
|
11
|
+
* 保留字符串索引签名,以赋给 PluginOptions 的 Record<string, unknown> 泛型约束。
|
|
12
|
+
*/
|
|
13
|
+
export type DeepSeekProviderOptions = {
|
|
14
|
+
/** dsh 数据目录($DSH_HOME),默认跟随系统(~/.dsh) */
|
|
15
|
+
home?: string;
|
|
16
|
+
/** 默认 Agent 预设(dsh settings agent-presets.default,如 code/standard;新建会话的默认模式) */
|
|
17
|
+
agentPreset?: string;
|
|
18
|
+
/** 默认权限预设(dsh settings permission.defaultPreset) */
|
|
19
|
+
permissionPreset?: DeepSeekPermissionPreset;
|
|
20
|
+
/** 繁忙时 Enter 键行为(dsh settings ui-conversation.busyEnter) */
|
|
21
|
+
busyEnter?: DeepSeekBusyEnter;
|
|
22
|
+
/**
|
|
23
|
+
* Provider 允许自定义扩展字段
|
|
24
|
+
* [key: string]: unknown;
|
|
25
|
+
*/
|
|
26
|
+
[key: string]: unknown;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* dsh API 四象限 RPC envelope(客户端请求 / 服务端响应)。
|
|
30
|
+
* 字段为 type/rpcId/method/payload + result:{ok,value|error},不是标准 JSON-RPC。
|
|
31
|
+
*/
|
|
32
|
+
/** 客户端 → 服务端 请求体(POST /api/<method>) */
|
|
33
|
+
export interface ClientRequest {
|
|
34
|
+
type: "client-request";
|
|
35
|
+
rpcId: string;
|
|
36
|
+
method: string;
|
|
37
|
+
payload: Record<string, unknown>;
|
|
38
|
+
}
|
|
39
|
+
/** 服务端 → 客户端 响应体 */
|
|
40
|
+
export interface ServerResponse {
|
|
41
|
+
type: "server-response";
|
|
42
|
+
rpcId: string;
|
|
43
|
+
result: {
|
|
44
|
+
ok: true;
|
|
45
|
+
value: unknown;
|
|
46
|
+
} | {
|
|
47
|
+
ok: false;
|
|
48
|
+
error: {
|
|
49
|
+
code?: string;
|
|
50
|
+
message?: string;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/** 服务端推送帧(SSE data 载荷) */
|
|
55
|
+
export interface ServerRequest {
|
|
56
|
+
type: "server-request";
|
|
57
|
+
rpcId: string;
|
|
58
|
+
method: string;
|
|
59
|
+
payload: Record<string, unknown>;
|
|
60
|
+
}
|
|
61
|
+
/** 会话摘要(POST /api/session.list 的 items 项) */
|
|
62
|
+
export interface SessionSummary {
|
|
63
|
+
sessionId: string;
|
|
64
|
+
updatedAt: number;
|
|
65
|
+
running: boolean;
|
|
66
|
+
blank: boolean;
|
|
67
|
+
parentSessionId?: string;
|
|
68
|
+
origin?: "subagent";
|
|
69
|
+
cwd?: string;
|
|
70
|
+
agentPreset?: string;
|
|
71
|
+
/** 会话投影(标题等派生值存在 projections.values.title) */
|
|
72
|
+
projections?: {
|
|
73
|
+
values?: {
|
|
74
|
+
title?: string | null;
|
|
75
|
+
[key: string]: unknown;
|
|
76
|
+
};
|
|
77
|
+
[key: string]: unknown;
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/** session.list 的 value:容器对象(不是数组),会话在 items 下 */
|
|
81
|
+
export interface SessionListResult {
|
|
82
|
+
items: SessionSummary[];
|
|
83
|
+
}
|
|
84
|
+
/** 工作区视图(POST /api/workspace.list 的 items 项,用于按目录匹配会话) */
|
|
85
|
+
export interface WorkspaceView {
|
|
86
|
+
workspaceId: string;
|
|
87
|
+
path: string;
|
|
88
|
+
title: string;
|
|
89
|
+
sessionIds: string[];
|
|
90
|
+
createdAt: string;
|
|
91
|
+
updatedAt: string;
|
|
92
|
+
}
|
|
93
|
+
/** workspace.list 的 value:容器对象(不是数组),工作区在 items 下,archivedSessionIds 为已归档会话 */
|
|
94
|
+
export interface WorkspaceListResult {
|
|
95
|
+
items: WorkspaceView[];
|
|
96
|
+
archivedSessionIds: string[];
|
|
97
|
+
}
|
|
98
|
+
/** workspace.create 的 value(幂等:已存在则返回既有 workspace,created=false) */
|
|
99
|
+
export interface WorkspaceCreateResult {
|
|
100
|
+
workspace: WorkspaceView;
|
|
101
|
+
created: boolean;
|
|
102
|
+
}
|
|
103
|
+
/** 会话流式事件(session/event 的 event 字段) */
|
|
104
|
+
export interface SessionStreamEvent {
|
|
105
|
+
type: string;
|
|
106
|
+
seq: number;
|
|
107
|
+
time?: number;
|
|
108
|
+
data?: Record<string, unknown>;
|
|
109
|
+
}
|
|
110
|
+
/** dsh 会话日志事件类型(用于 thinking/status 推导的稳定子集) */
|
|
111
|
+
export declare const SESSION_EVENT_TYPES: {
|
|
112
|
+
/** 回合开始 → 视为 streaming */
|
|
113
|
+
readonly TURN_START: "turn/start";
|
|
114
|
+
/** 回合结束(稳定停等) */
|
|
115
|
+
readonly TURN_END: "turn/end";
|
|
116
|
+
/** 步骤开始 */
|
|
117
|
+
readonly STEP_START: "step/start";
|
|
118
|
+
/** 步骤结束 */
|
|
119
|
+
readonly STEP_END: "step/end";
|
|
120
|
+
/** 助手输出完成 */
|
|
121
|
+
readonly ASSISTANT_MESSAGE: "assistant/message";
|
|
122
|
+
/** 助手输出增量分片 */
|
|
123
|
+
readonly ASSISTANT_CHUNK: "assistant/chunk";
|
|
124
|
+
/** 思考增量分片 */
|
|
125
|
+
readonly THINKING_DELTA: "thinking/delta";
|
|
126
|
+
};
|
|
127
|
+
export type SessionEventType = (typeof SESSION_EVENT_TYPES)[keyof typeof SESSION_EVENT_TYPES];
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aipanel/provider-deepseek",
|
|
3
|
+
"version": "1.2.0-beta.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "lib/index.cjs",
|
|
6
|
+
"module": "es/index.js",
|
|
7
|
+
"types": "es/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"es",
|
|
10
|
+
"lib"
|
|
11
|
+
],
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./es/index.d.ts",
|
|
15
|
+
"import": "./es/index.js",
|
|
16
|
+
"require": "./lib/index.cjs"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public",
|
|
21
|
+
"registry": "https://registry.npmjs.org/"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"execa": "^9.6.1",
|
|
25
|
+
"@aipanel/core": "1.2.0-beta.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"esbuild": "^0.25.0"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "pagoda-cli build && node scripts/build-dsh-assets.mjs",
|
|
32
|
+
"typecheck": "tsc -p tsconfig.declaration.json --noEmit"
|
|
33
|
+
}
|
|
34
|
+
}
|