@cxyhhhhh/dsh-qqbot 0.1.0-dev.202608141910 → 0.1.0-dev.202608142103
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 +11 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +21 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/index.d.ts +13 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +27 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/misc.d.ts +12 -0
- package/dist/commands/misc.d.ts.map +1 -0
- package/dist/commands/misc.js +30 -0
- package/dist/commands/misc.js.map +1 -0
- package/dist/commands/model.d.ts +7 -0
- package/dist/commands/model.d.ts.map +1 -0
- package/dist/commands/model.js +58 -0
- package/dist/commands/model.js.map +1 -0
- package/dist/commands/session.d.ts +10 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +26 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +24 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/types.d.ts +12 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +2 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -118
- package/dist/index.js.map +1 -1
- package/dist/model/index.d.ts +10 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/index.js +9 -0
- package/dist/model/index.js.map +1 -0
- package/dist/model/model-resolver.d.ts +80 -0
- package/dist/model/model-resolver.d.ts.map +1 -0
- package/dist/model/model-resolver.js +140 -0
- package/dist/model/model-resolver.js.map +1 -0
- package/dist/model/prefs-store.d.ts +21 -0
- package/dist/model/prefs-store.d.ts.map +1 -0
- package/dist/model/prefs-store.js +98 -0
- package/dist/model/prefs-store.js.map +1 -0
- package/dist/model/settings-reader.d.ts +19 -0
- package/dist/model/settings-reader.d.ts.map +1 -0
- package/dist/model/settings-reader.js +76 -0
- package/dist/model/settings-reader.js.map +1 -0
- package/dist/model/types.d.ts +15 -0
- package/dist/model/types.d.ts.map +1 -0
- package/dist/model/types.js +5 -0
- package/dist/model/types.js.map +1 -0
- package/dist/session/idle-evictor.d.ts +18 -0
- package/dist/session/idle-evictor.d.ts.map +1 -0
- package/dist/session/idle-evictor.js +31 -0
- package/dist/session/idle-evictor.js.map +1 -0
- package/dist/session/index.d.ts +9 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +8 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/session-manager.d.ts +44 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/{session-manager.js → session/session-manager.js} +157 -70
- package/dist/session/session-manager.js.map +1 -0
- package/dist/session/types.d.ts +124 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +2 -0
- package/dist/session/types.js.map +1 -0
- package/dist/setup.d.ts +3 -2
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +51 -34
- package/dist/setup.js.map +1 -1
- package/dist/shared/index.d.ts +7 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +7 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/scope.d.ts +14 -0
- package/dist/shared/scope.d.ts.map +1 -0
- package/dist/shared/scope.js +12 -0
- package/dist/shared/scope.js.map +1 -0
- package/dist/shared/send-helper.d.ts +11 -0
- package/dist/shared/send-helper.d.ts.map +1 -0
- package/dist/shared/send-helper.js +13 -0
- package/dist/shared/send-helper.js.map +1 -0
- package/dist/shared/utils.d.ts +19 -0
- package/dist/shared/utils.d.ts.map +1 -0
- package/dist/shared/utils.js +66 -0
- package/dist/shared/utils.js.map +1 -0
- package/dist/transport/chunker.d.ts.map +1 -0
- package/dist/{chunker.js → transport/chunker.js} +0 -5
- package/dist/transport/chunker.js.map +1 -0
- package/dist/{inbound.d.ts → transport/inbound.d.ts} +3 -3
- package/dist/transport/inbound.d.ts.map +1 -0
- package/dist/{inbound.js → transport/inbound.js} +0 -51
- package/dist/transport/inbound.js.map +1 -0
- package/dist/transport/index.d.ts +10 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +10 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/outbound-buffer.d.ts +32 -0
- package/dist/transport/outbound-buffer.d.ts.map +1 -0
- package/dist/transport/outbound-buffer.js +65 -0
- package/dist/transport/outbound-buffer.js.map +1 -0
- package/dist/{outbound.d.ts → transport/outbound.d.ts} +5 -7
- package/dist/transport/outbound.d.ts.map +1 -0
- package/dist/{outbound.js → transport/outbound.js} +2 -72
- package/dist/transport/outbound.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunker.d.ts.map +0 -1
- package/dist/chunker.js.map +0 -1
- package/dist/inbound.d.ts.map +0 -1
- package/dist/inbound.js.map +0 -1
- package/dist/model-resolver.d.ts +0 -67
- package/dist/model-resolver.d.ts.map +0 -1
- package/dist/model-resolver.js +0 -221
- package/dist/model-resolver.js.map +0 -1
- package/dist/outbound.d.ts.map +0 -1
- package/dist/outbound.js.map +0 -1
- package/dist/session-manager.d.ts +0 -134
- package/dist/session-manager.d.ts.map +0 -1
- package/dist/session-manager.js.map +0 -1
- /package/dist/{chunker.d.ts → transport/chunker.d.ts} +0 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* /bot-help — 查看所有指令以及用途
|
|
3
|
+
*
|
|
4
|
+
* 参考 openclaw-qqbot 的 bot-help.ts:遍历所有非隐藏命令,
|
|
5
|
+
* 用 <qqbot-cmd-input> 展示为可点击按钮,以 Markdown 格式发送。
|
|
6
|
+
*/
|
|
7
|
+
import type { SlashCommand } from '@tencent-connect/qqbot-nodejs';
|
|
8
|
+
import type { CommandDeps } from './types.js';
|
|
9
|
+
/** /bot-help — 查看所有指令以及用途 */
|
|
10
|
+
export declare function helpCommand({ config }: CommandDeps, allCommands: () => SlashCommand[]): SlashCommand;
|
|
11
|
+
//# sourceMappingURL=help.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,6BAA6B;AAC7B,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,EAAE,GAAG,YAAY,CAkBpG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { sendMarkdownChunked } from '../shared/index.js';
|
|
2
|
+
/** /bot-help — 查看所有指令以及用途 */
|
|
3
|
+
export function helpCommand({ config }, allCommands) {
|
|
4
|
+
return {
|
|
5
|
+
name: 'bot-help',
|
|
6
|
+
description: '查看所有指令以及用途',
|
|
7
|
+
handler: async (cmdCtx) => {
|
|
8
|
+
const lines = ['### QQBot插件内置指令', ''];
|
|
9
|
+
for (const cmd of allCommands()) {
|
|
10
|
+
const name = Array.isArray(cmd.name) ? cmd.name[0] : cmd.name;
|
|
11
|
+
if (cmd.hidden)
|
|
12
|
+
continue;
|
|
13
|
+
lines.push(`<qqbot-cmd-input text="/${name}" show="/${name}"/> ${cmd.description ?? ''}`);
|
|
14
|
+
}
|
|
15
|
+
lines.push('', '> dsh-qqbot v0.1.0');
|
|
16
|
+
await sendMarkdownChunked(cmdCtx, lines.join('\n'), config.textChunkLimit);
|
|
17
|
+
return { kind: 'noop' };
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,6BAA6B;AAC7B,MAAM,UAAU,WAAW,CAAC,EAAE,MAAM,EAAe,EAAE,WAAiC;IACpF,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,YAAY;QACzB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACxB,MAAM,KAAK,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;YAEtC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC9D,IAAI,GAAG,CAAC,MAAM;oBAAE,SAAS;gBACzB,KAAK,CAAC,IAAI,CAAC,2BAA2B,IAAI,YAAY,IAAI,OAAO,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,CAAC;YAC5F,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC;YACrC,MAAM,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;YAC3E,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 斜杠命令注册中心
|
|
3
|
+
*
|
|
4
|
+
* 每个命令拆分为独立文件,此处仅编排。参考 openclaw-qqbot 的
|
|
5
|
+
* commands/index.ts 模式:工厂函数注入依赖,统一导出命令列表。
|
|
6
|
+
*/
|
|
7
|
+
import type { SlashCommand } from '@tencent-connect/qqbot-nodejs';
|
|
8
|
+
import type { CommandDeps } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* 构建标准命令列表
|
|
11
|
+
*/
|
|
12
|
+
export declare function buildCommandList(deps: CommandDeps): SlashCommand[];
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAO9C;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,EAAE,CAmBlE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { resetCommand, newCommand } from './session.js';
|
|
2
|
+
import { modelCommand } from './model.js';
|
|
3
|
+
import { statusCommand } from './status.js';
|
|
4
|
+
import { helpCommand } from './help.js';
|
|
5
|
+
import { pingCommand, versionCommand, stopCommand } from './misc.js';
|
|
6
|
+
/**
|
|
7
|
+
* 构建标准命令列表
|
|
8
|
+
*/
|
|
9
|
+
export function buildCommandList(deps) {
|
|
10
|
+
const commands = [
|
|
11
|
+
// 会话
|
|
12
|
+
resetCommand(deps),
|
|
13
|
+
newCommand(deps),
|
|
14
|
+
// 模型
|
|
15
|
+
modelCommand(deps),
|
|
16
|
+
// 状态
|
|
17
|
+
statusCommand(deps),
|
|
18
|
+
// 杂项
|
|
19
|
+
pingCommand(),
|
|
20
|
+
versionCommand(deps),
|
|
21
|
+
stopCommand(),
|
|
22
|
+
];
|
|
23
|
+
// help 需要访问完整列表(含自身),通过闭包惰性引用
|
|
24
|
+
commands.push(helpCommand(deps, () => commands));
|
|
25
|
+
return commands;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAErE;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAiB;IAChD,MAAM,QAAQ,GAAmB;QAC/B,KAAK;QACL,YAAY,CAAC,IAAI,CAAC;QAClB,UAAU,CAAC,IAAI,CAAC;QAChB,KAAK;QACL,YAAY,CAAC,IAAI,CAAC;QAClB,KAAK;QACL,aAAa,CAAC,IAAI,CAAC;QACnB,KAAK;QACL,WAAW,EAAE;QACb,cAAc,CAAC,IAAI,CAAC;QACpB,WAAW,EAAE;KACd,CAAC;IAEF,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEjD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 杂项命令:/ping /version /stop
|
|
3
|
+
*/
|
|
4
|
+
import type { SlashCommand } from '@tencent-connect/qqbot-nodejs';
|
|
5
|
+
import type { CommandDeps } from './types.js';
|
|
6
|
+
/** /bot-ping — 连通性测试 */
|
|
7
|
+
export declare function pingCommand(): SlashCommand;
|
|
8
|
+
/** /bot-version — 查看版本信息 */
|
|
9
|
+
export declare function versionCommand({ manager }: CommandDeps): SlashCommand;
|
|
10
|
+
/** /bot-stop — 中止当前生成(隐藏) */
|
|
11
|
+
export declare function stopCommand(): SlashCommand;
|
|
12
|
+
//# sourceMappingURL=misc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../src/commands/misc.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAwB;AACxB,wBAAgB,WAAW,IAAI,YAAY,CAM1C;AAED,4BAA4B;AAC5B,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,YAAY,CAUrE;AAED,6BAA6B;AAC7B,wBAAgB,WAAW,IAAI,YAAY,CAO1C"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** /bot-ping — 连通性测试 */
|
|
2
|
+
export function pingCommand() {
|
|
3
|
+
return {
|
|
4
|
+
name: 'bot-ping',
|
|
5
|
+
description: '连通性测试',
|
|
6
|
+
handler: () => 'pong 🏓',
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
/** /bot-version — 查看版本信息 */
|
|
10
|
+
export function versionCommand({ manager }) {
|
|
11
|
+
return {
|
|
12
|
+
name: 'bot-version',
|
|
13
|
+
description: '查看版本信息',
|
|
14
|
+
handler: () => {
|
|
15
|
+
const current = manager.getEffectiveModel('c2c', '');
|
|
16
|
+
const modelInfo = current ? `${current.provider}/${current.model}` : '宿主默认';
|
|
17
|
+
return `dsh-qqbot v0.1.0 | model: ${modelInfo}`;
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/** /bot-stop — 中止当前生成(隐藏) */
|
|
22
|
+
export function stopCommand() {
|
|
23
|
+
return {
|
|
24
|
+
name: 'bot-stop',
|
|
25
|
+
description: '中止当前生成',
|
|
26
|
+
hidden: true,
|
|
27
|
+
handler: () => ({ kind: 'noop' }),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=misc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"misc.js","sourceRoot":"","sources":["../../src/commands/misc.ts"],"names":[],"mappings":"AAMA,wBAAwB;AACxB,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,OAAO;QACpB,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS;KACzB,CAAC;AACJ,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,cAAc,CAAC,EAAE,OAAO,EAAe;IACrD,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,QAAQ;QACrB,OAAO,EAAE,GAAG,EAAE;YACZ,MAAM,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACrD,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YAC5E,OAAO,6BAA6B,SAAS,EAAE,CAAC;QAClD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,QAAQ;QACrB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,CAAC;KAC3C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模型命令:/bot-model — 查看或切换模型
|
|
3
|
+
*/
|
|
4
|
+
import type { SlashCommand } from '@tencent-connect/qqbot-nodejs';
|
|
5
|
+
import type { CommandDeps } from './types.js';
|
|
6
|
+
export declare function modelCommand({ manager, config }: CommandDeps): SlashCommand;
|
|
7
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/commands/model.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,WAAW,GAAG,YAAY,CAgE3E"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { getScopePeer, sendMarkdownChunked } from '../shared/index.js';
|
|
2
|
+
export function modelCommand({ manager, config }) {
|
|
3
|
+
return {
|
|
4
|
+
name: 'bot-model',
|
|
5
|
+
description: '查看或切换模型(用法: /bot-model [provider/model])',
|
|
6
|
+
handler: async (cmdCtx) => {
|
|
7
|
+
const { scope, peerId } = getScopePeer(cmdCtx);
|
|
8
|
+
const args = (cmdCtx.command?.raw ?? '').trim();
|
|
9
|
+
// 无参数:显示当前模型 + 可用模型列表(可点击)
|
|
10
|
+
if (!args) {
|
|
11
|
+
const current = manager.getEffectiveModel(scope, peerId);
|
|
12
|
+
const models = manager.listAvailableModels();
|
|
13
|
+
// 当前模型展示:优先用别名(name),找不到别名时回退到 provider/model id
|
|
14
|
+
let currentDisplay = '宿主默认配置';
|
|
15
|
+
if (current) {
|
|
16
|
+
const matched = models.find((m) => m.provider === current.provider && m.id === current.model);
|
|
17
|
+
currentDisplay = matched?.name ?? `${current.provider}/${current.model}`;
|
|
18
|
+
}
|
|
19
|
+
const lines = [
|
|
20
|
+
'### 🤖 模型配置',
|
|
21
|
+
'',
|
|
22
|
+
`**当前模型:** ${currentDisplay}`,
|
|
23
|
+
];
|
|
24
|
+
if (models.length > 0) {
|
|
25
|
+
lines.push('', '**可用模型(点击切换):**');
|
|
26
|
+
for (const m of models) {
|
|
27
|
+
const modelPath = `${m.provider}/${m.id}`;
|
|
28
|
+
const displayName = m.name ? `${m.name}` : modelPath;
|
|
29
|
+
lines.push(`<qqbot-cmd-input text="/bot-model ${modelPath}" show="/bot-model ${displayName}"/>`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
lines.push('', '手动指定: `/bot-model provider/model`');
|
|
33
|
+
await sendMarkdownChunked(cmdCtx, lines.join('\n'), config.textChunkLimit);
|
|
34
|
+
return { kind: 'noop' };
|
|
35
|
+
}
|
|
36
|
+
// 解析 provider/model 格式
|
|
37
|
+
let provider;
|
|
38
|
+
let model;
|
|
39
|
+
if (args.includes('/')) {
|
|
40
|
+
const parts = args.split('/');
|
|
41
|
+
provider = parts[0] ?? '';
|
|
42
|
+
model = parts.slice(1).join('/');
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// 仅指定 model 名,provider 从当前路由继承
|
|
46
|
+
const current = manager.getEffectiveModel(scope, peerId);
|
|
47
|
+
provider = current?.provider ?? 'deepseek-official';
|
|
48
|
+
model = args;
|
|
49
|
+
}
|
|
50
|
+
if (!provider || !model) {
|
|
51
|
+
return '用法: /bot-model provider/model\n示例: /bot-model deepseek-official/deepseek-chat';
|
|
52
|
+
}
|
|
53
|
+
await manager.setModelOverride(scope, peerId, { provider, model });
|
|
54
|
+
return `✅ 模型已切换: ${provider}/${model}\n立即生效,对话上下文保留。`;
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/commands/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 会话相关命令:/bot-reset /bot-clear /bot-new
|
|
3
|
+
*/
|
|
4
|
+
import type { SlashCommand } from '@tencent-connect/qqbot-nodejs';
|
|
5
|
+
import type { CommandDeps } from './types.js';
|
|
6
|
+
/** /bot-reset /bot-clear — 重置当前会话 */
|
|
7
|
+
export declare function resetCommand({ manager }: CommandDeps): SlashCommand;
|
|
8
|
+
/** /bot-new — 开始新会话 */
|
|
9
|
+
export declare function newCommand({ manager }: CommandDeps): SlashCommand;
|
|
10
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,qCAAqC;AACrC,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,YAAY,CAUnE;AAED,uBAAuB;AACvB,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,YAAY,CAUjE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { getScopePeer } from '../shared/index.js';
|
|
2
|
+
/** /bot-reset /bot-clear — 重置当前会话 */
|
|
3
|
+
export function resetCommand({ manager }) {
|
|
4
|
+
return {
|
|
5
|
+
name: ['bot-reset', 'bot-clear'],
|
|
6
|
+
description: '重置当前会话(清除上下文)',
|
|
7
|
+
handler: (cmdCtx) => {
|
|
8
|
+
const { scope, peerId } = getScopePeer(cmdCtx);
|
|
9
|
+
void manager.remove(scope, peerId);
|
|
10
|
+
return '会话已重置 ✓';
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/** /bot-new — 开始新会话 */
|
|
15
|
+
export function newCommand({ manager }) {
|
|
16
|
+
return {
|
|
17
|
+
name: 'bot-new',
|
|
18
|
+
description: '开始新会话(清空上下文)',
|
|
19
|
+
handler: (cmdCtx) => {
|
|
20
|
+
const { scope, peerId } = getScopePeer(cmdCtx);
|
|
21
|
+
void manager.remove(scope, peerId);
|
|
22
|
+
return '已开启新会话 ✓';
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,qCAAqC;AACrC,MAAM,UAAU,YAAY,CAAC,EAAE,OAAO,EAAe;IACnD,OAAO;QACL,IAAI,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC;QAChC,WAAW,EAAE,eAAe;QAC5B,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE;YAClB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAC/C,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACnC,OAAO,SAAS,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,uBAAuB;AACvB,MAAM,UAAU,UAAU,CAAC,EAAE,OAAO,EAAe;IACjD,OAAO;QACL,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE;YAClB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAC/C,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACnC,OAAO,UAAU,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 状态命令:/bot-status
|
|
3
|
+
*/
|
|
4
|
+
import type { SlashCommand } from '@tencent-connect/qqbot-nodejs';
|
|
5
|
+
import type { CommandDeps } from './types.js';
|
|
6
|
+
/** /bot-status — 查看当前会话状态 */
|
|
7
|
+
export declare function statusCommand({ manager }: CommandDeps): SlashCommand;
|
|
8
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,6BAA6B;AAC7B,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,YAAY,CAmBpE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { getScopePeer, formatRelativeTime } from '../shared/index.js';
|
|
2
|
+
/** /bot-status — 查看当前会话状态 */
|
|
3
|
+
export function statusCommand({ manager }) {
|
|
4
|
+
return {
|
|
5
|
+
name: 'bot-status',
|
|
6
|
+
description: '查看当前会话状态',
|
|
7
|
+
handler: (cmdCtx) => {
|
|
8
|
+
const { scope, peerId } = getScopePeer(cmdCtx);
|
|
9
|
+
const status = manager.getStatus(scope, peerId);
|
|
10
|
+
if (!status.active)
|
|
11
|
+
return '当前无活跃会话';
|
|
12
|
+
const modelInfo = status.model ? `${status.provider}/${status.model}` : '宿主默认';
|
|
13
|
+
return [
|
|
14
|
+
'📊 会话状态',
|
|
15
|
+
`会话: ${status.sessionId ? status.sessionId.slice(0, 8) : '—'}`,
|
|
16
|
+
`模型: ${modelInfo}`,
|
|
17
|
+
`Preset: ${status.preset ?? '无'}`,
|
|
18
|
+
`消息数: ${status.messageCount ?? 0}`,
|
|
19
|
+
`最后活动: ${formatRelativeTime(status.lastActivity)}`,
|
|
20
|
+
].join('\n');
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAEtE,6BAA6B;AAC7B,MAAM,UAAU,aAAa,CAAC,EAAE,OAAO,EAAe;IACpD,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,UAAU;QACvB,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE;YAClB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,MAAM;gBAAE,OAAO,SAAS,CAAC;YACrC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YAC/E,OAAO;gBACL,SAAS;gBACT,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;gBAC9D,OAAO,SAAS,EAAE;gBAClB,WAAW,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE;gBACjC,QAAQ,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE;gBAClC,SAAS,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE;aACnD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 命令依赖类型
|
|
3
|
+
*
|
|
4
|
+
* 每个命令工厂函数接收 CommandDeps,由 commands/index.ts 统一注入。
|
|
5
|
+
*/
|
|
6
|
+
import type { SessionManager } from '../session/index.js';
|
|
7
|
+
import type { ImQQBotConfig } from '../config.js';
|
|
8
|
+
export interface CommandDeps {
|
|
9
|
+
manager: SessionManager;
|
|
10
|
+
config: ImQQBotConfig;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,aAAa,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAmBnD,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAS/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,CAmC9E"}
|
package/dist/index.js
CHANGED
|
@@ -1,25 +1,14 @@
|
|
|
1
|
-
import { fileURLToPath } from 'node:url';
|
|
2
|
-
import { dirname, resolve } from 'node:path';
|
|
3
1
|
import { QQBot, errorHandler, messageFilter, accessPolicy, mentionGate, contentSanitizer, rateLimiter, slashCommand, concurrencyGuard, typingIndicator, quoteRef, historyBuffer, envelopeFormatter, MemoryHistoryStore, } from '@tencent-connect/qqbot-nodejs';
|
|
4
2
|
import { ConfigSchema } from './config.js';
|
|
5
|
-
import { SessionManager } from './session
|
|
6
|
-
import { handleInbound } from './
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const PLUGIN_ROOT = resolve(__dirname, '..');
|
|
11
|
-
/** 从插件安装路径推导 profile 目录(node_modules 的父目录) */
|
|
12
|
-
function getProfileDir() {
|
|
13
|
-
const nmIdx = PLUGIN_ROOT.lastIndexOf('/node_modules/');
|
|
14
|
-
if (nmIdx > 0)
|
|
15
|
-
return PLUGIN_ROOT.slice(0, nmIdx);
|
|
16
|
-
return null;
|
|
17
|
-
}
|
|
3
|
+
import { SessionManager } from './session/index.js';
|
|
4
|
+
import { handleInbound, createOutboundHandler } from './transport/index.js';
|
|
5
|
+
import { buildCommandList } from './commands/index.js';
|
|
6
|
+
import { getProfileDir, resolveEnv, buildUserAgent } from './shared/index.js';
|
|
7
|
+
import { runQrSetup, persistCredentialsToProfile } from './setup.js';
|
|
18
8
|
// ── Cordis 插件元数据 ──
|
|
19
9
|
export const name = 'im-qqbot';
|
|
20
10
|
export const inject = ['agents'];
|
|
21
11
|
export const Config = ConfigSchema;
|
|
22
|
-
import { runQrSetup, persistCredentialsToProfile } from './setup.js';
|
|
23
12
|
// ── 插件主体 ──
|
|
24
13
|
export async function apply(ctx, config) {
|
|
25
14
|
const agents = ctx.agents;
|
|
@@ -51,13 +40,15 @@ export async function apply(ctx, config) {
|
|
|
51
40
|
async function bootstrap(ctx, agents, config, logger) {
|
|
52
41
|
const manager = new SessionManager(ctx, agents, config, logger);
|
|
53
42
|
// ── 初始化 QQ Bot SDK ──
|
|
43
|
+
const userAgent = buildUserAgent();
|
|
54
44
|
const bot = new QQBot({
|
|
55
45
|
appId: config.appId,
|
|
56
46
|
appSecret: config.appSecret,
|
|
57
47
|
transport: 'websocket',
|
|
48
|
+
userAgent,
|
|
58
49
|
logger,
|
|
59
50
|
});
|
|
60
|
-
console.log(
|
|
51
|
+
console.log(`[im-qqbot] QQBot SDK initialized (UA: ${userAgent})`);
|
|
61
52
|
// ══════════════════════════════════════════════════════════════
|
|
62
53
|
// SDK 中间件链(洋葱模型,按执行顺序编排)
|
|
63
54
|
// ══════════════════════════════════════════════════════════════
|
|
@@ -101,7 +92,7 @@ async function bootstrap(ctx, agents, config, logger) {
|
|
|
101
92
|
// 8. 斜杠命令(在 concurrencyGuard 之前,命令匹配后不排队直接响应)
|
|
102
93
|
const slash = slashCommand({
|
|
103
94
|
autoHelp: true,
|
|
104
|
-
commands:
|
|
95
|
+
commands: buildCommandList({ manager, config }),
|
|
105
96
|
});
|
|
106
97
|
bot.use(slash.middleware);
|
|
107
98
|
// 9. 并发串行 + 消息合并(同 peer 排队,避免 session 冲突)
|
|
@@ -110,7 +101,7 @@ async function bootstrap(ctx, agents, config, logger) {
|
|
|
110
101
|
maxQueue: config.maxQueue,
|
|
111
102
|
maxProcessingMs: config.processingTimeoutMs,
|
|
112
103
|
urgentPredicate: (mCtx) => {
|
|
113
|
-
return (mCtx.message.content ?? '').trim() === '/stop';
|
|
104
|
+
return (mCtx.message.content ?? '').trim() === '/bot-stop';
|
|
114
105
|
},
|
|
115
106
|
}));
|
|
116
107
|
// 10. C2C 输入状态指示
|
|
@@ -161,103 +152,4 @@ async function bootstrap(ctx, agents, config, logger) {
|
|
|
161
152
|
};
|
|
162
153
|
}, 'im-qqbot.lifecycle');
|
|
163
154
|
}
|
|
164
|
-
// ── 斜杠命令定义 ──
|
|
165
|
-
function buildCommands(manager, _config) {
|
|
166
|
-
return [
|
|
167
|
-
{
|
|
168
|
-
name: ['reset', 'clear'],
|
|
169
|
-
description: '重置当前会话(清除上下文)',
|
|
170
|
-
handler: (cmdCtx) => {
|
|
171
|
-
const msg = cmdCtx.message;
|
|
172
|
-
const scope = msg.kind === 'group' ? 'group' : 'c2c';
|
|
173
|
-
const peerId = scope === 'group'
|
|
174
|
-
? (msg.groupOpenid ?? msg.senderId)
|
|
175
|
-
: msg.senderId;
|
|
176
|
-
void manager.remove(scope, peerId);
|
|
177
|
-
return '会话已重置 ✓';
|
|
178
|
-
},
|
|
179
|
-
},
|
|
180
|
-
{
|
|
181
|
-
name: 'model',
|
|
182
|
-
description: '查看或切换模型(用法: /model [provider/model])',
|
|
183
|
-
handler: async (cmdCtx) => {
|
|
184
|
-
const msg = cmdCtx.message;
|
|
185
|
-
const scope = msg.kind === 'group' ? 'group' : 'c2c';
|
|
186
|
-
const peerId = scope === 'group'
|
|
187
|
-
? (msg.groupOpenid ?? msg.senderId)
|
|
188
|
-
: msg.senderId;
|
|
189
|
-
const args = (cmdCtx.command?.raw ?? '').trim();
|
|
190
|
-
// 无参数:显示当前模型 + 可用模型列表(可点击)
|
|
191
|
-
if (!args) {
|
|
192
|
-
const current = manager.getEffectiveModel(scope, peerId);
|
|
193
|
-
const models = manager.listAvailableModels();
|
|
194
|
-
const lines = [
|
|
195
|
-
'### 🤖 模型配置',
|
|
196
|
-
'',
|
|
197
|
-
`**当前模型:** ${current ? `\`${current.provider}/${current.model}\`` : '宿主默认配置'}`,
|
|
198
|
-
];
|
|
199
|
-
if (models.length > 0) {
|
|
200
|
-
lines.push('', '**可用模型(点击切换):**');
|
|
201
|
-
for (const m of models) {
|
|
202
|
-
const modelPath = `${m.provider}/${m.id}`;
|
|
203
|
-
const displayName = m.name ? `${m.name}` : modelPath;
|
|
204
|
-
lines.push(`<qqbot-cmd-input text="/model ${modelPath}" show="/model ${displayName}"/>`);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
lines.push('', '手动指定: `/model provider/model`');
|
|
208
|
-
const bot = cmdCtx.bot;
|
|
209
|
-
const replyTarget = cmdCtx.replyTarget;
|
|
210
|
-
await bot.sendMarkdown(replyTarget, lines.join('\n'));
|
|
211
|
-
return { kind: 'noop' };
|
|
212
|
-
}
|
|
213
|
-
// 解析 provider/model 格式
|
|
214
|
-
let provider;
|
|
215
|
-
let model;
|
|
216
|
-
if (args.includes('/')) {
|
|
217
|
-
const parts = args.split('/');
|
|
218
|
-
provider = parts[0] ?? '';
|
|
219
|
-
model = parts.slice(1).join('/');
|
|
220
|
-
}
|
|
221
|
-
else {
|
|
222
|
-
// 仅指定 model 名,provider 从当前路由继承
|
|
223
|
-
const current = manager.getEffectiveModel(scope, peerId);
|
|
224
|
-
provider = current?.provider ?? 'deepseek-official';
|
|
225
|
-
model = args;
|
|
226
|
-
}
|
|
227
|
-
if (!provider || !model) {
|
|
228
|
-
return '用法: /model provider/model\n示例: /model deepseek-official/deepseek-chat';
|
|
229
|
-
}
|
|
230
|
-
await manager.setModelOverride(scope, peerId, { provider, model });
|
|
231
|
-
return `✅ 模型已切换: ${provider}/${model}\n会话已重置,下次对话将使用新模型。`;
|
|
232
|
-
},
|
|
233
|
-
},
|
|
234
|
-
{
|
|
235
|
-
name: 'ping',
|
|
236
|
-
description: '连通性测试',
|
|
237
|
-
handler: () => 'pong 🏓',
|
|
238
|
-
},
|
|
239
|
-
{
|
|
240
|
-
name: 'version',
|
|
241
|
-
description: '查看版本信息',
|
|
242
|
-
handler: () => {
|
|
243
|
-
const current = manager.getEffectiveModel('c2c', '');
|
|
244
|
-
const modelInfo = current ? `${current.provider}/${current.model}` : '宿主默认';
|
|
245
|
-
return `dsh-qqbot v0.1.0 | model: ${modelInfo}`;
|
|
246
|
-
},
|
|
247
|
-
},
|
|
248
|
-
{
|
|
249
|
-
name: 'stop',
|
|
250
|
-
description: '中止当前生成',
|
|
251
|
-
hidden: true,
|
|
252
|
-
handler: () => ({ kind: 'noop' }),
|
|
253
|
-
},
|
|
254
|
-
];
|
|
255
|
-
}
|
|
256
|
-
// ── 工具函数 ──
|
|
257
|
-
function resolveEnv(configValue, envKey) {
|
|
258
|
-
if (configValue && configValue !== '__FROM_ENV__' && !configValue.startsWith('process.env')) {
|
|
259
|
-
return configValue;
|
|
260
|
-
}
|
|
261
|
-
return process.env[envKey] ?? '';
|
|
262
|
-
}
|
|
263
155
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模型路由层
|
|
3
|
+
*
|
|
4
|
+
* 统一的模型发现、路由解析、per-peer 偏好管理。
|
|
5
|
+
*/
|
|
6
|
+
export { ModelResolver } from './model-resolver.js';
|
|
7
|
+
export { PrefsStore } from './prefs-store.js';
|
|
8
|
+
export { SettingsReader } from './settings-reader.js';
|
|
9
|
+
export type { ModelRoute, ModelEntry } from './types.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/model/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/model/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|