@cxyhhhhh/dsh-qqbot 0.5.0-dev.202610101632 → 0.5.0-dev.202610101921
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/dist/commands/help.d.ts +1 -1
- package/dist/commands/help.js +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -8
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -21
- package/dist/index.js.map +1 -1
- package/dist/setup/bind-routes.d.ts +52 -9
- package/dist/setup/bind-routes.d.ts.map +1 -1
- package/dist/setup/bind-routes.js +237 -12
- package/dist/setup/bind-routes.js.map +1 -1
- package/dist/setup/index.d.ts +23 -4
- package/dist/setup/index.d.ts.map +1 -1
- package/dist/setup/index.js +48 -4
- package/dist/setup/index.js.map +1 -1
- package/dist/setup/persist.d.ts +24 -0
- package/dist/setup/persist.d.ts.map +1 -1
- package/dist/setup/persist.js +84 -1
- package/dist/setup/persist.js.map +1 -1
- package/dist/setup/presenters.d.ts +1 -1
- package/dist/setup/presenters.js +1 -1
- package/dist/shared/bind-protocol.d.ts +42 -0
- package/dist/shared/bind-protocol.d.ts.map +1 -0
- package/dist/shared/bind-protocol.js +19 -0
- package/dist/shared/bind-protocol.js.map +1 -0
- package/dist/transport/reply-limiter.d.ts +1 -1
- package/dist/transport/reply-limiter.js +1 -1
- package/lib/client.js +732 -108
- package/lib/client.js.map +1 -1
- package/package.json +8 -1
- package/tsconfig.client.json +1 -1
package/dist/commands/help.d.ts
CHANGED
package/dist/commands/help.js
CHANGED
package/dist/config.d.ts
CHANGED
|
@@ -88,5 +88,7 @@ export interface ImQQBotConfig {
|
|
|
88
88
|
/** 附件发送(qqbot_send_file 工具) */
|
|
89
89
|
sendFile: SendFileConfig;
|
|
90
90
|
}
|
|
91
|
+
/** 访问控制子 Schema(独立导出:config 路由的服务端校验复用) */
|
|
92
|
+
export declare const AccessControlSchema: Schema<AccessControlConfig>;
|
|
91
93
|
export declare const ConfigSchema: Schema<ImQQBotConfig>;
|
|
92
94
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,MAAM,MAAM,0BAA0B,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC,eAAe;IACf,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAC;IAC3C,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa;IACb,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAC;IAC7C,0BAA0B;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,8DAA8D;IAC9D,aAAa,EAAE,OAAO,CAAC;IACvB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,2BAA2B;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,6BAA6B;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW;IACX,MAAM,EAAE,mBAAmB,CAAC;IAC5B,6BAA6B;IAC7B,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW;IACX,KAAK,EAAE,OAAO,CAAC;IACf,mBAAmB;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,4DAA4D;IAC5D,MAAM,EAAE,YAAY,CAAC;IACrB,+BAA+B;IAC/B,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,aAAa,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,MAAM,MAAM,0BAA0B,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC,eAAe;IACf,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAC;IAC3C,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa;IACb,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAC;IAC7C,0BAA0B;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,8DAA8D;IAC9D,aAAa,EAAE,OAAO,CAAC;IACvB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,2BAA2B;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,6BAA6B;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW;IACX,MAAM,EAAE,mBAAmB,CAAC;IAC5B,6BAA6B;IAC7B,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW;IACX,KAAK,EAAE,OAAO,CAAC;IACf,mBAAmB;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,4DAA4D;IAC5D,MAAM,EAAE,YAAY,CAAC;IACrB,+BAA+B;IAC/B,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,2CAA2C;AAC3C,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,CAK1D,CAAC;AAEH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,aAAa,CA0D7C,CAAC"}
|
package/dist/config.js
CHANGED
|
@@ -2,9 +2,16 @@
|
|
|
2
2
|
* dsh-im-qqbot 插件配置 Schema
|
|
3
3
|
*/
|
|
4
4
|
import Schema from '@deepseek-ai/schemastery';
|
|
5
|
+
/** 访问控制子 Schema(独立导出:config 路由的服务端校验复用) */
|
|
6
|
+
export const AccessControlSchema = Schema.object({
|
|
7
|
+
c2cMode: Schema.union(['open', 'allowlist', 'disabled']).default('open').description('C2C访问模式'),
|
|
8
|
+
c2cAllow: Schema.array(Schema.string()).default([]).description('C2C白名单'),
|
|
9
|
+
groupMode: Schema.union(['open', 'allowlist', 'disabled']).default('open').description('群聊访问模式'),
|
|
10
|
+
groupAllow: Schema.array(Schema.string()).default([]).description('群聊白名单'),
|
|
11
|
+
});
|
|
5
12
|
export const ConfigSchema = Schema.object({
|
|
6
|
-
appId: Schema.string().default('').description('QQ
|
|
7
|
-
appSecret: Schema.string().default('').description('QQ
|
|
13
|
+
appId: Schema.string().default('').description('QQ 机器人 AppID'),
|
|
14
|
+
appSecret: Schema.string().default('').description('QQ 机器人 AppSecret'),
|
|
8
15
|
provider: Schema.string().description('LLM provider name'),
|
|
9
16
|
model: Schema.string().description('Model name'),
|
|
10
17
|
preset: Schema.string().description('Agent preset id'),
|
|
@@ -19,12 +26,7 @@ export const ConfigSchema = Schema.object({
|
|
|
19
26
|
processingTimeoutMs: Schema.number().default(30 * 60 * 1000).description('处理超时(ms),超时中断当前 LLM 调用'),
|
|
20
27
|
askTimeoutMs: Schema.number().default(5 * 60 * 1000).description('待答问题超时(ms),超时自动拒绝并提示'),
|
|
21
28
|
historyLimit: Schema.number().default(10).description('群历史缓冲条数'),
|
|
22
|
-
access:
|
|
23
|
-
c2cMode: Schema.union(['open', 'allowlist', 'disabled']).default('open').description('C2C访问模式'),
|
|
24
|
-
c2cAllow: Schema.array(Schema.string()).default([]).description('C2C白名单'),
|
|
25
|
-
groupMode: Schema.union(['open', 'allowlist', 'disabled']).default('open').description('群聊访问模式'),
|
|
26
|
-
groupAllow: Schema.array(Schema.string()).default([]).description('群聊白名单'),
|
|
27
|
-
}).default({
|
|
29
|
+
access: AccessControlSchema.default({
|
|
28
30
|
c2cMode: 'open',
|
|
29
31
|
c2cAllow: [],
|
|
30
32
|
groupMode: 'open',
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,MAAM,MAAM,0BAA0B,CAAC;AA6F9C,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAQ/D,eAAO,MAAM,IAAI,aAAa,CAAC;AAC/B,eAAO,MAAM,MAAM,UAAa,CAAC;AACjC,eAAO,MAAM,MAAM,2DAAe,CAAC;AAEnC,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAQ/D,eAAO,MAAM,IAAI,aAAa,CAAC;AAC/B,eAAO,MAAM,MAAM,UAAa,CAAC;AACjC,eAAO,MAAM,MAAM,2DAAe,CAAC;AAEnC,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA2D9E"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ConfigSchema } from "./config.js";
|
|
2
2
|
import { bootstrapGateway } from "./gateway/index.js";
|
|
3
3
|
import { getProfileDir, resolveEnv } from "./shared/index.js";
|
|
4
|
-
import { ensureCredentials, persistCredentialsToProfile } from "./setup/index.js";
|
|
4
|
+
import { ensureCredentials, persistCredentialsToProfile, registerBoundCredentialRoutes } from "./setup/index.js";
|
|
5
5
|
// ── Cordis 插件元数据 ──
|
|
6
6
|
export const name = 'im-qqbot';
|
|
7
7
|
export const inject = ['agents'];
|
|
@@ -14,27 +14,47 @@ export async function apply(ctx, config) {
|
|
|
14
14
|
let appSecret = resolveEnv(config.appSecret, 'QQBOT_SECRET');
|
|
15
15
|
// ── 凭据缺失时唤起扫码绑定 ──
|
|
16
16
|
if (!appId || !appSecret) {
|
|
17
|
-
logger.info('
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
//
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
17
|
+
logger.info('凭据未配置,启动扫码绑定...');
|
|
18
|
+
// 关键:不 await 扫码结果。boot 会等 Loader 树稳定(loader.await()),
|
|
19
|
+
// 无限期等待用户扫码会阻塞 Host ready——Desktop 界面无法进入、
|
|
20
|
+
// Web 的 URL 延迟输出。绑定编排(路由/呈现/生命周期)在
|
|
21
|
+
// ensureCredentials 的同步阶段即完成,凭据就绪后由异步链接管。
|
|
22
|
+
void ensureCredentials(ctx, { logger, config: { ...config } })
|
|
23
|
+
.then((credentials) => {
|
|
24
|
+
if (!credentials) {
|
|
25
|
+
// null 包括:扫码取消、手动提交(已另行持久化)、流程失败
|
|
26
|
+
logger.info('扫码绑定流程结束(未获取凭据或已手动配置)');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// 写入环境变量(供热更新后的下次 apply 或本次直接启动读取)
|
|
30
|
+
process.env.QQBOT_APPID = credentials.appId;
|
|
31
|
+
process.env.QQBOT_SECRET = credentials.appSecret;
|
|
32
|
+
// 持久化到 profile:成功则等待热更新重载,失败则用凭据直接启动
|
|
33
|
+
const persisted = persistCredentialsToProfile(credentials, getProfileDir() ?? undefined, logger);
|
|
34
|
+
if (persisted) {
|
|
35
|
+
// 写入 cordis.patch.yml 会触发 dsh 热更新,自动重新加载本插件。
|
|
36
|
+
logger.info('配置已保存,等待热更新重新加载...');
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
logger.warn('凭据未能持久化,本次进程将使用环境变量凭据启动(重启后需重新绑定)');
|
|
40
|
+
// 本 fiber 已激活(ctx 有效),直接以凭据启动网关
|
|
41
|
+
void bootstrapGateway(ctx, agents, {
|
|
42
|
+
...config,
|
|
43
|
+
appId: credentials.appId,
|
|
44
|
+
appSecret: credentials.appSecret,
|
|
45
|
+
}, logger).catch((err) => {
|
|
46
|
+
logger.error(`网关启动失败: ${err instanceof Error ? err.message : String(err)}`);
|
|
47
|
+
});
|
|
48
|
+
})
|
|
49
|
+
.catch((err) => {
|
|
50
|
+
// 全兜:unhandled rejection 会被宿主 fail-loud 判致命
|
|
51
|
+
logger.error(`扫码绑定流程异常: ${err instanceof Error ? err.message : String(err)}`);
|
|
52
|
+
});
|
|
53
|
+
// apply 立即完成,插件 fiber 进入 ACTIVE,Host ready 不再被阻塞
|
|
54
|
+
return;
|
|
37
55
|
}
|
|
56
|
+
// 已绑定:注册常驻路由(状态回显 + 手动编辑/更换凭据 + 配置编辑)
|
|
57
|
+
registerBoundCredentialRoutes(ctx, logger, appId, { ...config });
|
|
38
58
|
const resolvedConfig = { ...config, appId, appSecret };
|
|
39
59
|
await bootstrapGateway(ctx, agents, resolvedConfig, logger);
|
|
40
60
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAsB,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,17 +5,17 @@
|
|
|
5
5
|
* - Web 模式:页面同源直接访问
|
|
6
6
|
* - Desktop:渲染进程的 fetch 经 IPC 桥自动附加 Host 认证转发
|
|
7
7
|
*
|
|
8
|
-
* 响应只含 task 级短时效数据(二维码 URL/SVG
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* 响应只含 task 级短时效数据(二维码 URL/SVG)与脱敏的 appId;
|
|
9
|
+
* appSecret 绝不出现在任何响应中。manual 提交走与扫码一致的
|
|
10
|
+
* persist 路径(写入 profile patch → HMR 重载生效)。
|
|
11
11
|
*/
|
|
12
12
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
13
13
|
import type { Logger } from '../types.ts';
|
|
14
14
|
import type { BindingService } from './binding-service.ts';
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
export
|
|
15
|
+
import { type SetupCredentials } from './persist.ts';
|
|
16
|
+
import { BIND_CONFIG_PATH, BIND_MANUAL_PATH, BIND_REFRESH_PATH, BIND_STATE_PATH, BIND_UNBIND_PATH, type BindStateWire } from '../shared/bind-protocol.ts';
|
|
17
|
+
export { BIND_CONFIG_PATH, BIND_MANUAL_PATH, BIND_REFRESH_PATH, BIND_STATE_PATH, BIND_UNBIND_PATH };
|
|
18
|
+
export type { BindStateWire };
|
|
19
19
|
/** dsh-host-webserver 的具名路由注册形状(局部投影,避免硬依赖) */
|
|
20
20
|
export interface WebRoute {
|
|
21
21
|
kind: 'exact' | 'prefix';
|
|
@@ -26,10 +26,53 @@ export interface WebRoute {
|
|
|
26
26
|
export interface WebServerLike {
|
|
27
27
|
register(route: WebRoute): () => void;
|
|
28
28
|
}
|
|
29
|
+
/** 手动凭据提交的处理结果 */
|
|
30
|
+
export interface ManualSubmitResult {
|
|
31
|
+
/** 是否已持久化(false = 落盘失败,需展示手动配置指引) */
|
|
32
|
+
persisted: boolean;
|
|
33
|
+
/** 失败原因(persisted=false 时回传给表单展示) */
|
|
34
|
+
error?: string;
|
|
35
|
+
}
|
|
36
|
+
/** 解绑处理结果 */
|
|
37
|
+
export interface UnbindResult {
|
|
38
|
+
persisted: boolean;
|
|
39
|
+
error?: string;
|
|
40
|
+
}
|
|
41
|
+
/** 路由行为注入 */
|
|
42
|
+
export interface BindRoutesOptions {
|
|
43
|
+
/**
|
|
44
|
+
* 已绑定态:返回脱敏的 appId(可回显,非机密),null 表示未绑定。
|
|
45
|
+
* 已绑定 fiber 注册路由时提供;待绑定流程不提供。
|
|
46
|
+
*/
|
|
47
|
+
boundAppId?: () => string | null;
|
|
48
|
+
/**
|
|
49
|
+
* 手动凭据提交处理(默认:persist 到 profile patch)。
|
|
50
|
+
* 待绑定流程会注入「先终止扫码轮询」的包装。
|
|
51
|
+
*/
|
|
52
|
+
onManualCredentials?: (credentials: SetupCredentials) => ManualSubmitResult;
|
|
53
|
+
/**
|
|
54
|
+
* 解绑处理(默认:移除 profile patch 中的凭据字段)。
|
|
55
|
+
* 未绑定态调用返回 409,不触达本回调。
|
|
56
|
+
*/
|
|
57
|
+
onUnbind?: () => UnbindResult;
|
|
58
|
+
/**
|
|
59
|
+
* 当前生效配置(apply 时 loader 合并后的值,含默认值填充),
|
|
60
|
+
* 用于 GET 回显(appSecret 剔除后返回)。
|
|
61
|
+
*/
|
|
62
|
+
currentConfig?: () => Record<string, unknown>;
|
|
63
|
+
/**
|
|
64
|
+
* 配置写入处理(默认:最小合并写入 profile patch)。
|
|
65
|
+
*/
|
|
66
|
+
onUpdateConfig?: (config: Record<string, unknown>) => boolean;
|
|
67
|
+
}
|
|
29
68
|
/**
|
|
30
|
-
*
|
|
69
|
+
* 注册绑定路由(状态查询 / 刷新二维码 / 手动凭据)。
|
|
31
70
|
*
|
|
71
|
+
* @param webServer - ctx.webServer
|
|
72
|
+
* @param service - 绑定状态机;已绑定 fiber 传 null(无扫码流程)
|
|
73
|
+
* @param logger - 日志
|
|
74
|
+
* @param options - 行为注入(bound 态回显、manual 处理)
|
|
32
75
|
* @returns 注销函数(与插件 fiber 生命周期绑定)
|
|
33
76
|
*/
|
|
34
|
-
export declare function registerBindRoutes(webServer: WebServerLike, service: BindingService, logger: Logger): () => void;
|
|
77
|
+
export declare function registerBindRoutes(webServer: WebServerLike, service: BindingService | null, logger: Logger, options?: BindRoutesOptions): () => void;
|
|
35
78
|
//# sourceMappingURL=bind-routes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bind-routes.d.ts","sourceRoot":"","sources":["../../src/setup/bind-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"bind-routes.d.ts","sourceRoot":"","sources":["../../src/setup/bind-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,KAAK,aAAa,EACnB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC;AACpG,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,+CAA+C;AAC/C,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9E;AAED,uCAAuC;AACvC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,IAAI,CAAC;CACvC;AAED,kBAAkB;AAClB,MAAM,WAAW,kBAAkB;IACjC,qCAAqC;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,aAAa;AACb,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,aAAa;AACb,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IACjC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,gBAAgB,KAAK,kBAAkB,CAAC;IAC5E;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,YAAY,CAAC;IAC9B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;CAC/D;AAwCD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,cAAc,GAAG,IAAI,EAC9B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,GAC9B,MAAM,IAAI,CAoCZ"}
|
|
@@ -1,34 +1,96 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { persistCredentialsToProfile, removeCredentialsFromProfile, updateProfileConfig, } from "./persist.js";
|
|
2
|
+
import { getProfileDir } from "../shared/index.js";
|
|
3
|
+
import { AccessControlSchema } from "../config.js";
|
|
4
|
+
import { BIND_CONFIG_PATH, BIND_MANUAL_PATH, BIND_REFRESH_PATH, BIND_STATE_PATH, BIND_UNBIND_PATH, } from "../shared/bind-protocol.js";
|
|
5
|
+
// 协议单一来源:shared/bind-protocol.ts(类型 + 路径常量,客户端共用)
|
|
6
|
+
export { BIND_CONFIG_PATH, BIND_MANUAL_PATH, BIND_REFRESH_PATH, BIND_STATE_PATH, BIND_UNBIND_PATH };
|
|
7
|
+
/** 可经 UI 编辑的配置键(白名单:只收用户必要的字段,其余走 patch/env) */
|
|
8
|
+
const EDITABLE_CONFIG_KEYS = new Set([
|
|
9
|
+
'requireMention', 'streaming', 'showToolResults', 'debug',
|
|
10
|
+
'provider', 'model', 'preset',
|
|
11
|
+
'groupPrompt', 'directPrompt',
|
|
12
|
+
'access',
|
|
13
|
+
]);
|
|
14
|
+
/** 白名单键的子 Schema(服务端校验:客户端校验仅为体验,安全边界在宿主) */
|
|
15
|
+
const EDITABLE_CONFIG_SCHEMAS = {
|
|
16
|
+
requireMention: (v) => booleanSchema(v, 'requireMention'),
|
|
17
|
+
streaming: (v) => booleanSchema(v, 'streaming'),
|
|
18
|
+
showToolResults: (v) => booleanSchema(v, 'showToolResults'),
|
|
19
|
+
debug: (v) => booleanSchema(v, 'debug'),
|
|
20
|
+
provider: stringSchema('provider'),
|
|
21
|
+
model: stringSchema('model'),
|
|
22
|
+
preset: stringSchema('preset'),
|
|
23
|
+
groupPrompt: stringSchema('groupPrompt'),
|
|
24
|
+
directPrompt: stringSchema('directPrompt'),
|
|
25
|
+
access: (v) => AccessControlSchema(v),
|
|
26
|
+
};
|
|
27
|
+
function booleanSchema(value, name) {
|
|
28
|
+
if (typeof value !== 'boolean')
|
|
29
|
+
throw new TypeError(`${name} 必须是布尔值`);
|
|
30
|
+
return value;
|
|
31
|
+
}
|
|
32
|
+
function stringSchema(name) {
|
|
33
|
+
return (value) => {
|
|
34
|
+
if (typeof value !== 'string')
|
|
35
|
+
throw new TypeError(`${name} 必须是字符串`);
|
|
36
|
+
if (value.length > 20000)
|
|
37
|
+
throw new TypeError(`${name} 过长`);
|
|
38
|
+
return value;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/** manual 请求体大小上限(appId + appSecret 远小于此值) */
|
|
42
|
+
const MAX_MANUAL_BODY_BYTES = 4096;
|
|
5
43
|
/**
|
|
6
|
-
*
|
|
44
|
+
* 注册绑定路由(状态查询 / 刷新二维码 / 手动凭据)。
|
|
7
45
|
*
|
|
46
|
+
* @param webServer - ctx.webServer
|
|
47
|
+
* @param service - 绑定状态机;已绑定 fiber 传 null(无扫码流程)
|
|
48
|
+
* @param logger - 日志
|
|
49
|
+
* @param options - 行为注入(bound 态回显、manual 处理)
|
|
8
50
|
* @returns 注销函数(与插件 fiber 生命周期绑定)
|
|
9
51
|
*/
|
|
10
|
-
export function registerBindRoutes(webServer, service, logger) {
|
|
52
|
+
export function registerBindRoutes(webServer, service, logger, options = {}) {
|
|
53
|
+
const defaultManual = (credentials) => {
|
|
54
|
+
const persisted = persistCredentialsToProfile(credentials, getProfileDir() ?? undefined, logger);
|
|
55
|
+
return persisted ? { persisted: true } : { persisted: false, error: '无法定位 profile 目录或写入失败,请改用环境变量配置' };
|
|
56
|
+
};
|
|
57
|
+
const handleManualSubmit = options.onManualCredentials ?? defaultManual;
|
|
11
58
|
const disposers = [
|
|
12
59
|
webServer.register({
|
|
13
60
|
kind: 'exact',
|
|
14
61
|
path: BIND_STATE_PATH,
|
|
15
|
-
handler: (req, res) => { handleState(req, res, service); },
|
|
62
|
+
handler: (req, res) => { handleState(req, res, service, options); },
|
|
16
63
|
}),
|
|
17
64
|
webServer.register({
|
|
18
65
|
kind: 'exact',
|
|
19
66
|
path: BIND_REFRESH_PATH,
|
|
20
67
|
handler: (req, res) => { handleRefresh(req, res, service); },
|
|
21
68
|
}),
|
|
69
|
+
webServer.register({
|
|
70
|
+
kind: 'exact',
|
|
71
|
+
path: BIND_MANUAL_PATH,
|
|
72
|
+
handler: (req, res) => handleManual(req, res, handleManualSubmit),
|
|
73
|
+
}),
|
|
74
|
+
webServer.register({
|
|
75
|
+
kind: 'exact',
|
|
76
|
+
path: BIND_UNBIND_PATH,
|
|
77
|
+
handler: (req, res) => handleUnbind(req, res, options),
|
|
78
|
+
}),
|
|
79
|
+
webServer.register({
|
|
80
|
+
kind: 'exact',
|
|
81
|
+
path: BIND_CONFIG_PATH,
|
|
82
|
+
handler: (req, res) => handleConfig(req, res, options),
|
|
83
|
+
}),
|
|
22
84
|
];
|
|
23
85
|
logger.info(`im-qqbot: 端内绑定页已就绪: ${BIND_STATE_PATH}`);
|
|
24
86
|
return () => { for (const dispose of disposers)
|
|
25
87
|
dispose(); };
|
|
26
88
|
}
|
|
27
89
|
/**
|
|
28
|
-
* 请求来源校验(最小 CSRF
|
|
90
|
+
* 请求来源校验(最小 CSRF 防护)。
|
|
29
91
|
*
|
|
30
92
|
* 带 Origin 的请求必须与 Host 同源;同源 fetch 与 Desktop IPC 桥
|
|
31
|
-
* (后者会删除 origin
|
|
93
|
+
* (后者会删除 origin 头)均放行。本路由数据不敏感且动作无害,
|
|
32
94
|
* 该级别的防护足够。
|
|
33
95
|
*/
|
|
34
96
|
function trusted(req) {
|
|
@@ -50,7 +112,7 @@ function sendJson(res, status, body) {
|
|
|
50
112
|
});
|
|
51
113
|
res.end(payload);
|
|
52
114
|
}
|
|
53
|
-
function handleState(req, res, service) {
|
|
115
|
+
function handleState(req, res, service, options) {
|
|
54
116
|
if (!trusted(req)) {
|
|
55
117
|
sendJson(res, 403, { error: 'forbidden' });
|
|
56
118
|
return;
|
|
@@ -59,7 +121,13 @@ function handleState(req, res, service) {
|
|
|
59
121
|
sendJson(res, 405, { error: 'method not allowed' });
|
|
60
122
|
return;
|
|
61
123
|
}
|
|
62
|
-
|
|
124
|
+
// 已绑定优先(appSecret 不回传,appId 非机密可回显)
|
|
125
|
+
const boundAppId = options.boundAppId?.() ?? null;
|
|
126
|
+
if (boundAppId !== null) {
|
|
127
|
+
sendJson(res, 200, { phase: 'bound', appId: boundAppId });
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
sendJson(res, 200, service === null ? { phase: 'starting' } : service.wireState());
|
|
63
131
|
}
|
|
64
132
|
function handleRefresh(req, res, service) {
|
|
65
133
|
if (!trusted(req)) {
|
|
@@ -72,8 +140,165 @@ function handleRefresh(req, res, service) {
|
|
|
72
140
|
}
|
|
73
141
|
// 丢弃可能的请求体(refresh 无参数)
|
|
74
142
|
req.resume();
|
|
75
|
-
service
|
|
143
|
+
service?.refresh();
|
|
76
144
|
// 新二维码异步生成,统一由状态轮询收敛
|
|
77
145
|
sendJson(res, 200, { phase: 'starting' });
|
|
78
146
|
}
|
|
147
|
+
/** 读取并解析 JSON 请求体(带大小上限) */
|
|
148
|
+
async function readJsonBody(req) {
|
|
149
|
+
const chunks = [];
|
|
150
|
+
let size = 0;
|
|
151
|
+
for await (const chunk of req) {
|
|
152
|
+
const buffer = chunk;
|
|
153
|
+
size += buffer.length;
|
|
154
|
+
if (size > MAX_MANUAL_BODY_BYTES)
|
|
155
|
+
throw new Error('request body too large');
|
|
156
|
+
chunks.push(buffer);
|
|
157
|
+
}
|
|
158
|
+
if (size === 0)
|
|
159
|
+
throw new Error('empty request body');
|
|
160
|
+
return JSON.parse(Buffer.concat(chunks).toString('utf8'));
|
|
161
|
+
}
|
|
162
|
+
/** 校验手动提交的凭据形态(不打印内容) */
|
|
163
|
+
function parseCredentials(body) {
|
|
164
|
+
if (typeof body !== 'object' || body === null)
|
|
165
|
+
return null;
|
|
166
|
+
const record = body;
|
|
167
|
+
const appId = typeof record.appId === 'string' ? record.appId.trim() : '';
|
|
168
|
+
const appSecret = typeof record.appSecret === 'string' ? record.appSecret.trim() : '';
|
|
169
|
+
if (appId.length === 0 || appSecret.length === 0)
|
|
170
|
+
return null;
|
|
171
|
+
if (appId.length > 128 || appSecret.length > 256)
|
|
172
|
+
return null;
|
|
173
|
+
return { appId, appSecret };
|
|
174
|
+
}
|
|
175
|
+
async function handleManual(req, res, submit) {
|
|
176
|
+
if (!trusted(req)) {
|
|
177
|
+
sendJson(res, 403, { error: 'forbidden' });
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
if (req.method !== 'POST') {
|
|
181
|
+
sendJson(res, 405, { error: 'method not allowed' });
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
let body;
|
|
185
|
+
try {
|
|
186
|
+
body = await readJsonBody(req);
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
sendJson(res, 400, { ok: false, error: `invalid request body: ${err instanceof Error ? err.message : String(err)}` });
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const credentials = parseCredentials(body);
|
|
193
|
+
if (credentials === null) {
|
|
194
|
+
sendJson(res, 400, { ok: false, error: 'appId 与 appSecret 不能为空' });
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const result = submit(credentials);
|
|
198
|
+
if (!result.persisted) {
|
|
199
|
+
sendJson(res, 500, { ok: false, error: result.error ?? '保存失败' });
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
// 写入 profile patch 触发 HMR 重载,新 fiber 以新凭据启动网关
|
|
203
|
+
sendJson(res, 200, { ok: true, message: '凭据已保存,插件将自动重载' });
|
|
204
|
+
}
|
|
205
|
+
/** 解绑:仅已绑定态可执行;移除 profile patch 中的凭据并触发 HMR 重载 */
|
|
206
|
+
function handleUnbind(req, res, options) {
|
|
207
|
+
if (!trusted(req)) {
|
|
208
|
+
sendJson(res, 403, { error: 'forbidden' });
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
if (req.method !== 'POST') {
|
|
212
|
+
sendJson(res, 405, { error: 'method not allowed' });
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
req.resume();
|
|
216
|
+
if ((options.boundAppId?.() ?? null) === null) {
|
|
217
|
+
sendJson(res, 409, { ok: false, error: '当前未绑定' });
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const result = options.onUnbind === undefined
|
|
221
|
+
? (() => {
|
|
222
|
+
const removed = removeCredentialsFromProfile(getProfileDir() ?? undefined, undefined);
|
|
223
|
+
return removed
|
|
224
|
+
? { persisted: true }
|
|
225
|
+
: { persisted: false, error: '无法定位 profile 目录或写入失败,请手动编辑 cordis.patch.yml' };
|
|
226
|
+
})()
|
|
227
|
+
: options.onUnbind();
|
|
228
|
+
if (!result.persisted) {
|
|
229
|
+
sendJson(res, 500, { ok: false, error: result.error ?? '解绑失败' });
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
// 移除后写入触发 HMR 重载,插件回到未绑定态(绑定流程重新可用)
|
|
233
|
+
sendJson(res, 200, { ok: true, message: '已解绑,插件将重载并重新进入绑定流程' });
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* 配置读写:
|
|
237
|
+
* - GET:回显当前生效配置(appSecret 剔除,cwd 等只读字段正常返回)
|
|
238
|
+
* - POST:白名单 + 子 Schema 校验 → 最小写入 profile patch → HMR 重载
|
|
239
|
+
*/
|
|
240
|
+
async function handleConfig(req, res, options) {
|
|
241
|
+
if (!trusted(req)) {
|
|
242
|
+
sendJson(res, 403, { error: 'forbidden' });
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
if (req.method !== 'GET' && req.method !== 'POST') {
|
|
246
|
+
sendJson(res, 405, { error: 'method not allowed' });
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
if (req.method === 'GET') {
|
|
250
|
+
const current = options.currentConfig?.() ?? {};
|
|
251
|
+
// appSecret 永不回传;其余(含只读 cwd)原样回显
|
|
252
|
+
const { appSecret: _s, ...safe } = current;
|
|
253
|
+
sendJson(res, 200, { config: safe });
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
let body;
|
|
257
|
+
try {
|
|
258
|
+
body = await readJsonBody(req);
|
|
259
|
+
}
|
|
260
|
+
catch (err) {
|
|
261
|
+
sendJson(res, 400, { ok: false, error: `invalid request body: ${err instanceof Error ? err.message : String(err)}` });
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
if (typeof body !== 'object' || body === null) {
|
|
265
|
+
sendJson(res, 400, { ok: false, error: '请求体必须是 JSON 对象' });
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
const submitted = body;
|
|
269
|
+
// 白名单与凭据/只读字段拦截
|
|
270
|
+
for (const key of Object.keys(submitted)) {
|
|
271
|
+
if (!EDITABLE_CONFIG_KEYS.has(key)) {
|
|
272
|
+
const reason = key === 'appId' || key === 'appSecret'
|
|
273
|
+
? '凭据请使用绑定/更换/解绑功能'
|
|
274
|
+
: key === 'cwd'
|
|
275
|
+
? 'cwd 为只读字段'
|
|
276
|
+
: '不支持的字段';
|
|
277
|
+
sendJson(res, 400, { ok: false, error: `${reason}: ${key}` });
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// 逐键 Schema 校验(非法值拒绝,返回首个错误)
|
|
282
|
+
let validated = {};
|
|
283
|
+
try {
|
|
284
|
+
validated = Object.fromEntries(Object.entries(submitted).map(([key, value]) => {
|
|
285
|
+
const check = EDITABLE_CONFIG_SCHEMAS[key];
|
|
286
|
+
if (check === undefined)
|
|
287
|
+
throw new TypeError(`不支持的字段: ${key}`);
|
|
288
|
+
return [key, check(value)];
|
|
289
|
+
}));
|
|
290
|
+
}
|
|
291
|
+
catch (err) {
|
|
292
|
+
sendJson(res, 400, { ok: false, error: err instanceof TypeError ? err.message : String(err) });
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
const persisted = options.onUpdateConfig === undefined
|
|
296
|
+
? updateProfileConfig(validated, getProfileDir() ?? undefined, undefined)
|
|
297
|
+
: options.onUpdateConfig(validated);
|
|
298
|
+
if (!persisted) {
|
|
299
|
+
sendJson(res, 500, { ok: false, error: '无法定位 profile 目录或写入失败' });
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
sendJson(res, 200, { ok: true, message: '配置已保存,插件将自动重载(进行中的机器人会话将重置)' });
|
|
303
|
+
}
|
|
79
304
|
//# sourceMappingURL=bind-routes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bind-routes.js","sourceRoot":"","sources":["../../src/setup/bind-routes.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bind-routes.js","sourceRoot":"","sources":["../../src/setup/bind-routes.ts"],"names":[],"mappings":"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"}
|