@zhin.js/scaffold-wizard 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/lib/adapter-configurers.d.ts +7 -7
- package/lib/adapter-configurers.d.ts.map +1 -1
- package/lib/adapter-configurers.js +55 -55
- package/lib/adapter-configurers.js.map +1 -1
- package/lib/adapter.d.ts +8 -8
- package/lib/adapter.d.ts.map +1 -1
- package/lib/adapter.js +42 -42
- package/lib/adapter.js.map +1 -1
- package/lib/ai.d.ts.map +1 -1
- package/lib/ai.js +13 -10
- package/lib/ai.js.map +1 -1
- package/lib/apply.js +3 -3
- package/lib/apply.js.map +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- package/lib/project-deps.d.ts +36 -1
- package/lib/project-deps.d.ts.map +1 -1
- package/lib/project-deps.js +158 -2
- package/lib/project-deps.js.map +1 -1
- package/lib/types.d.ts +1 -0
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js.map +1 -1
- package/package.json +7 -2
- package/src/adapter-configurers.ts +58 -58
- package/src/adapter.ts +47 -47
- package/src/ai.ts +13 -10
- package/src/apply.ts +3 -3
- package/src/index.ts +10 -3
- package/src/project-deps.ts +179 -2
- package/src/types.ts +1 -0
package/lib/project-deps.js
CHANGED
|
@@ -1,14 +1,170 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import path from 'node:path';
|
|
1
4
|
/** 与 monorepo 中 agent / test-bot 对齐的 MCP SDK 版本 */
|
|
2
5
|
export const MCP_SDK_VERSION = '^1.29.0';
|
|
6
|
+
const AI_STACK_VERSION = '^4.0.0';
|
|
7
|
+
const ZOD_VERSION = '^4.0.0';
|
|
8
|
+
const VERCEL_AI_VERSION = '^6.0.0';
|
|
9
|
+
const PROVIDER_SDK_PACKAGES = {
|
|
10
|
+
openai: { pkg: '@ai-sdk/openai', version: '^3.0.0' },
|
|
11
|
+
anthropic: { pkg: '@ai-sdk/anthropic', version: '^3.0.0' },
|
|
12
|
+
google: { pkg: '@ai-sdk/google', version: '^3.0.0' },
|
|
13
|
+
gemini: { pkg: '@ai-sdk/google', version: '^3.0.0' },
|
|
14
|
+
deepseek: { pkg: '@ai-sdk/deepseek', version: '^1.0.0' },
|
|
15
|
+
ollama: { pkg: '@ai-sdk/openai-compatible', version: '^1.0.0' },
|
|
16
|
+
moonshot: { pkg: '@ai-sdk/openai-compatible', version: '^1.0.0' },
|
|
17
|
+
zhipu: { pkg: '@ai-sdk/openai-compatible', version: '^1.0.0' },
|
|
18
|
+
};
|
|
19
|
+
function providerSdkPackage(provider) {
|
|
20
|
+
if (!provider)
|
|
21
|
+
return undefined;
|
|
22
|
+
return PROVIDER_SDK_PACKAGES[provider];
|
|
23
|
+
}
|
|
24
|
+
/** 启用 AI 时将写入 package.json 的依赖名(用于向导提示与 CLI 输出) */
|
|
25
|
+
export function listAIDependencyNames(provider, options) {
|
|
26
|
+
const names = ['@zhin.js/agent', 'zod', 'ai'];
|
|
27
|
+
if (options?.includeMcp !== false) {
|
|
28
|
+
names.push('@modelcontextprotocol/sdk');
|
|
29
|
+
}
|
|
30
|
+
const sdk = providerSdkPackage(provider);
|
|
31
|
+
if (sdk && !names.includes(sdk.pkg)) {
|
|
32
|
+
names.push(sdk.pkg);
|
|
33
|
+
}
|
|
34
|
+
return names;
|
|
35
|
+
}
|
|
36
|
+
export function formatAIDependencyHint(provider, options) {
|
|
37
|
+
return listAIDependencyNames(provider, options).join(', ');
|
|
38
|
+
}
|
|
39
|
+
/** zhin.config 中是否启用了 AI(enabled 未显式 false 且存在 agents/providers) */
|
|
40
|
+
export function isAiEnabledInConfig(config) {
|
|
41
|
+
const ai = config.ai;
|
|
42
|
+
if (!ai || typeof ai !== 'object' || Array.isArray(ai))
|
|
43
|
+
return false;
|
|
44
|
+
const rec = ai;
|
|
45
|
+
if (rec.enabled === false)
|
|
46
|
+
return false;
|
|
47
|
+
if (rec.enabled === true)
|
|
48
|
+
return true;
|
|
49
|
+
const agents = rec.agents;
|
|
50
|
+
if (agents && typeof agents === 'object' && !Array.isArray(agents) && Object.keys(agents).length > 0) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
const providers = rec.providers;
|
|
54
|
+
if (providers && typeof providers === 'object' && !Array.isArray(providers) && Object.keys(providers).length > 0) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
export function resolveDefaultProviderFromConfig(config) {
|
|
60
|
+
const ai = config.ai;
|
|
61
|
+
if (!ai || typeof ai !== 'object' || Array.isArray(ai))
|
|
62
|
+
return undefined;
|
|
63
|
+
const rec = ai;
|
|
64
|
+
const agents = rec.agents;
|
|
65
|
+
if (agents && typeof agents === 'object' && !Array.isArray(agents)) {
|
|
66
|
+
const zhin = agents.zhin;
|
|
67
|
+
if (zhin?.provider)
|
|
68
|
+
return String(zhin.provider);
|
|
69
|
+
const firstAgent = Object.values(agents)[0];
|
|
70
|
+
if (firstAgent?.provider)
|
|
71
|
+
return String(firstAgent.provider);
|
|
72
|
+
}
|
|
73
|
+
const providers = rec.providers;
|
|
74
|
+
if (providers && typeof providers === 'object' && !Array.isArray(providers)) {
|
|
75
|
+
const first = Object.keys(providers)[0];
|
|
76
|
+
if (first)
|
|
77
|
+
return first;
|
|
78
|
+
}
|
|
79
|
+
if (rec.defaultProvider != null)
|
|
80
|
+
return String(rec.defaultProvider);
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
function aiConfigNeedsMcp(ai) {
|
|
84
|
+
if (ai.memoryMcp === true)
|
|
85
|
+
return true;
|
|
86
|
+
const servers = ai.mcpServers;
|
|
87
|
+
return Array.isArray(servers) && servers.length > 0;
|
|
88
|
+
}
|
|
89
|
+
/** 根据 zhin.config 的 ai 段推导应安装的 production 依赖 */
|
|
90
|
+
export function getRequiredAIDependenciesForConfig(config) {
|
|
91
|
+
if (!isAiEnabledInConfig(config))
|
|
92
|
+
return {};
|
|
93
|
+
const ai = config.ai;
|
|
94
|
+
const setup = {
|
|
95
|
+
enabled: true,
|
|
96
|
+
defaultProvider: resolveDefaultProviderFromConfig(config),
|
|
97
|
+
memoryMcp: aiConfigNeedsMcp(ai),
|
|
98
|
+
};
|
|
99
|
+
const deps = getAIDependencies(setup);
|
|
100
|
+
if (!aiConfigNeedsMcp(ai)) {
|
|
101
|
+
delete deps['@modelcontextprotocol/sdk'];
|
|
102
|
+
}
|
|
103
|
+
return deps;
|
|
104
|
+
}
|
|
105
|
+
export function findMissingPackageDependencies(pkg, required) {
|
|
106
|
+
const declared = new Set([
|
|
107
|
+
...Object.keys(pkg.dependencies ?? {}),
|
|
108
|
+
...Object.keys(pkg.devDependencies ?? {}),
|
|
109
|
+
]);
|
|
110
|
+
return Object.keys(required).filter((name) => !declared.has(name));
|
|
111
|
+
}
|
|
112
|
+
export function findUnresolvedPackageInstalls(cwd, packageNames) {
|
|
113
|
+
const pkgJson = path.join(cwd, 'package.json');
|
|
114
|
+
if (!fs.existsSync(pkgJson))
|
|
115
|
+
return [...packageNames];
|
|
116
|
+
const req = createRequire(pkgJson);
|
|
117
|
+
const missing = [];
|
|
118
|
+
for (const name of packageNames) {
|
|
119
|
+
try {
|
|
120
|
+
req.resolve(`${name}/package.json`);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
missing.push(name);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return missing;
|
|
127
|
+
}
|
|
128
|
+
export function diagnoseAIDependencies(cwd, config, pkg) {
|
|
129
|
+
if (!isAiEnabledInConfig(config))
|
|
130
|
+
return null;
|
|
131
|
+
const required = getRequiredAIDependenciesForConfig(config);
|
|
132
|
+
const packageJsonPath = path.join(cwd, 'package.json');
|
|
133
|
+
const packageJson = pkg ?? (fs.existsSync(packageJsonPath) ? fs.readJsonSync(packageJsonPath) : {});
|
|
134
|
+
const missingFromPackageJson = findMissingPackageDependencies(packageJson, required);
|
|
135
|
+
const declared = Object.keys(required).filter((name) => !missingFromPackageJson.includes(name));
|
|
136
|
+
const notInstalled = findUnresolvedPackageInstalls(cwd, declared);
|
|
137
|
+
return {
|
|
138
|
+
enabled: true,
|
|
139
|
+
provider: resolveDefaultProviderFromConfig(config),
|
|
140
|
+
required,
|
|
141
|
+
missingFromPackageJson,
|
|
142
|
+
notInstalled,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
export function formatAIDependencyFixCommand(missing, required) {
|
|
146
|
+
if (missing.length === 0)
|
|
147
|
+
return 'pnpm install';
|
|
148
|
+
const specs = missing.map((name) => `${name}@${required[name] ?? 'latest'}`);
|
|
149
|
+
return `pnpm add ${specs.join(' ')}`;
|
|
150
|
+
}
|
|
3
151
|
/**
|
|
4
|
-
* AI
|
|
152
|
+
* AI 启用时安装 agent 栈 + 所选 provider 的 @ai-sdk/* + 可选 MCP SDK。
|
|
5
153
|
*/
|
|
6
154
|
export function getAIDependencies(ai) {
|
|
7
155
|
if (!ai?.enabled)
|
|
8
156
|
return {};
|
|
9
|
-
|
|
157
|
+
const deps = {
|
|
158
|
+
'@zhin.js/agent': AI_STACK_VERSION,
|
|
159
|
+
zod: ZOD_VERSION,
|
|
160
|
+
ai: VERCEL_AI_VERSION,
|
|
10
161
|
'@modelcontextprotocol/sdk': MCP_SDK_VERSION,
|
|
11
162
|
};
|
|
163
|
+
const sdk = providerSdkPackage(ai.defaultProvider);
|
|
164
|
+
if (sdk) {
|
|
165
|
+
deps[sdk.pkg] = sdk.version;
|
|
166
|
+
}
|
|
167
|
+
return deps;
|
|
12
168
|
}
|
|
13
169
|
/**
|
|
14
170
|
* AI 会话持久化默认开启时,若用户未选数据库则自动补 SQLite(零配置、与 inbox 一致)。
|
package/lib/project-deps.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-deps.js","sourceRoot":"","sources":["../src/project-deps.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"project-deps.js","sourceRoot":"","sources":["../src/project-deps.ts"],"names":[],"mappings":"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"}
|
package/lib/types.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export type { AISetupConfig } from './ai.js';
|
|
|
4
4
|
export type { AdapterSetupResult } from './adapter.js';
|
|
5
5
|
export interface InitOptions {
|
|
6
6
|
name?: string;
|
|
7
|
+
template?: 'default' | 'life-assistant';
|
|
7
8
|
config?: 'json' | 'yaml' | 'toml';
|
|
8
9
|
runtime?: 'node' | 'bun';
|
|
9
10
|
yes?: boolean;
|
package/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACzB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,EAAE,CAAC,EAAE,aAAa,CAAC;IACnB,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC;IACzD,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAGD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAMnF,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,SAAS,GAAG,gBAAgB,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACzB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,EAAE,CAAC,EAAE,aAAa,CAAC;IACnB,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC;IACzD,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAGD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAMnF,CAAC"}
|
package/lib/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAyBA,gDAAgD;AAChD,MAAM,CAAC,MAAM,iBAAiB,GAA0D;IACtF,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,QAAQ;IACf,EAAE,EAAE,IAAI;IACR,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;CACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhin.js/scaffold-wizard",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "Shared interactive scaffold wizard for create-zhin-app and @zhin.js/cli",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@types/fs-extra": "^11.0.4",
|
|
26
26
|
"@types/inquirer": "^9.0.7",
|
|
27
|
-
"@types/node": "^25.9.
|
|
27
|
+
"@types/node": "^25.9.2",
|
|
28
28
|
"typescript": "^6.0.3"
|
|
29
29
|
},
|
|
30
30
|
"engines": {
|
|
@@ -40,6 +40,11 @@
|
|
|
40
40
|
"access": "public",
|
|
41
41
|
"registry": "https://registry.npmjs.org"
|
|
42
42
|
},
|
|
43
|
+
"author": {
|
|
44
|
+
"name": "lc-cn",
|
|
45
|
+
"email": "admin@liucl.cn",
|
|
46
|
+
"url": "https://github.com/lc-cn"
|
|
47
|
+
},
|
|
43
48
|
"scripts": {
|
|
44
49
|
"build": "tsc",
|
|
45
50
|
"clean": "rimraf lib",
|
|
@@ -13,19 +13,19 @@ export const ADAPTERS_ESSENTIALS_URL = 'https://zhin.js.org/essentials/adapters'
|
|
|
13
13
|
/** 各适配器文档页(与 docs/adapters/*.md 同步) */
|
|
14
14
|
export const adapterDocsUrl = (slug: string) => `https://zhin.js.org/adapters/${slug}`;
|
|
15
15
|
|
|
16
|
-
export interface
|
|
16
|
+
export interface EndpointConfigureContext {
|
|
17
17
|
envVars: Record<string, string>;
|
|
18
18
|
markRequiresDatabase: () => void;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
export async function
|
|
21
|
+
export async function configureTelegramEndpoint(ctx: EndpointConfigureContext): Promise<Record<string, unknown>> {
|
|
22
22
|
console.log(chalk.gray(' 文档: ' + adapterDocsUrl('telegram')));
|
|
23
23
|
|
|
24
|
-
const {
|
|
24
|
+
const { endpointName } = await inquirer.prompt([
|
|
25
25
|
{
|
|
26
26
|
type: 'input',
|
|
27
|
-
name: '
|
|
28
|
-
message: '
|
|
27
|
+
name: 'endpointName',
|
|
28
|
+
message: ' Endpoint 标识名称:',
|
|
29
29
|
default: 'telegram-bot',
|
|
30
30
|
validate: (v: string) => (v.trim() ? true : '名称不能为空'),
|
|
31
31
|
},
|
|
@@ -35,7 +35,7 @@ export async function configureTelegramBot(ctx: BotConfigureContext): Promise<Re
|
|
|
35
35
|
{
|
|
36
36
|
type: 'password',
|
|
37
37
|
name: 'token',
|
|
38
|
-
message: ' Telegram
|
|
38
|
+
message: ' Telegram Endpoint Token(@BotFather 获取):',
|
|
39
39
|
validate: (v: string) => (v.trim() ? true : 'Token 不能为空'),
|
|
40
40
|
},
|
|
41
41
|
]);
|
|
@@ -60,9 +60,9 @@ export async function configureTelegramBot(ctx: BotConfigureContext): Promise<Re
|
|
|
60
60
|
},
|
|
61
61
|
]);
|
|
62
62
|
|
|
63
|
-
const
|
|
63
|
+
const endpointConfig: Record<string, unknown> = {
|
|
64
64
|
context: 'telegram',
|
|
65
|
-
name:
|
|
65
|
+
name: endpointName.trim(),
|
|
66
66
|
token: '${TELEGRAM_TOKEN}',
|
|
67
67
|
polling: transport === 'polling',
|
|
68
68
|
};
|
|
@@ -70,7 +70,7 @@ export async function configureTelegramBot(ctx: BotConfigureContext): Promise<Re
|
|
|
70
70
|
if (transport === 'webhook') {
|
|
71
71
|
console.log('');
|
|
72
72
|
console.log(chalk.yellow(' Webhook 前置条件:'));
|
|
73
|
-
console.log(chalk.gray(' •
|
|
73
|
+
console.log(chalk.gray(' • Endpoint 进程需绑定可被 Telegram 访问的 HTTPS 域名(有效 TLS 证书)'));
|
|
74
74
|
console.log(chalk.gray(' • 在 @BotFather 可配合 setWebhook,或由 Telegraf 在 launch 时注册'));
|
|
75
75
|
console.log(chalk.gray(' • 防火墙/反向代理需放行 webhook.port(默认由 Telegraf 监听)'));
|
|
76
76
|
|
|
@@ -104,26 +104,26 @@ export async function configureTelegramBot(ctx: BotConfigureContext): Promise<Re
|
|
|
104
104
|
},
|
|
105
105
|
]);
|
|
106
106
|
|
|
107
|
-
|
|
108
|
-
|
|
107
|
+
endpointConfig.polling = false;
|
|
108
|
+
endpointConfig.webhook = {
|
|
109
109
|
domain: webhook.domain.trim(),
|
|
110
110
|
path: webhook.path.trim(),
|
|
111
111
|
port: parseInt(webhook.port, 10),
|
|
112
112
|
};
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
-
return
|
|
115
|
+
return endpointConfig;
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
export async function
|
|
118
|
+
export async function configureGitHubEndpoint(ctx: EndpointConfigureContext): Promise<Record<string, unknown>> {
|
|
119
119
|
console.log(chalk.gray(' 文档: ' + adapterDocsUrl('github')));
|
|
120
120
|
ctx.markRequiresDatabase();
|
|
121
121
|
|
|
122
|
-
const {
|
|
122
|
+
const { endpointName } = await inquirer.prompt([
|
|
123
123
|
{
|
|
124
124
|
type: 'input',
|
|
125
|
-
name: '
|
|
126
|
-
message: '
|
|
125
|
+
name: 'endpointName',
|
|
126
|
+
message: ' Endpoint 标识名称:',
|
|
127
127
|
default: 'github-bot',
|
|
128
128
|
validate: (v: string) => (v.trim() ? true : '名称不能为空'),
|
|
129
129
|
},
|
|
@@ -148,9 +148,9 @@ export async function configureGitHubBot(ctx: BotConfigureContext): Promise<Reco
|
|
|
148
148
|
},
|
|
149
149
|
]);
|
|
150
150
|
|
|
151
|
-
const
|
|
151
|
+
const endpointConfig: Record<string, unknown> = {
|
|
152
152
|
context: 'github',
|
|
153
|
-
name:
|
|
153
|
+
name: endpointName.trim(),
|
|
154
154
|
};
|
|
155
155
|
|
|
156
156
|
if (authMode === 'github_app') {
|
|
@@ -173,8 +173,8 @@ export async function configureGitHubBot(ctx: BotConfigureContext): Promise<Reco
|
|
|
173
173
|
]);
|
|
174
174
|
|
|
175
175
|
ctx.envVars.GITHUB_APP_ID = appConfig.app_id.trim();
|
|
176
|
-
|
|
177
|
-
|
|
176
|
+
endpointConfig.app_id = '${GITHUB_APP_ID}';
|
|
177
|
+
endpointConfig.private_key = appConfig.private_key.trim();
|
|
178
178
|
} else {
|
|
179
179
|
console.log(chalk.gray(' 请确保已执行 gh auth login,且 gh 在 PATH 中'));
|
|
180
180
|
}
|
|
@@ -221,8 +221,8 @@ export async function configureGitHubBot(ctx: BotConfigureContext): Promise<Reco
|
|
|
221
221
|
]);
|
|
222
222
|
|
|
223
223
|
ctx.envVars.GITHUB_WEBHOOK_SECRET = webhook.webhook_secret;
|
|
224
|
-
|
|
225
|
-
|
|
224
|
+
endpointConfig.webhook_secret = '${GITHUB_WEBHOOK_SECRET}';
|
|
225
|
+
endpointConfig.webhook_path = webhook.webhook_path.trim();
|
|
226
226
|
} else {
|
|
227
227
|
const { poll_interval } = await inquirer.prompt([
|
|
228
228
|
{
|
|
@@ -237,7 +237,7 @@ export async function configureGitHubBot(ctx: BotConfigureContext): Promise<Reco
|
|
|
237
237
|
},
|
|
238
238
|
},
|
|
239
239
|
]);
|
|
240
|
-
|
|
240
|
+
endpointConfig.poll_interval = parseInt(poll_interval, 10);
|
|
241
241
|
}
|
|
242
242
|
|
|
243
243
|
const { enableMcp } = await inquirer.prompt([
|
|
@@ -261,10 +261,10 @@ export async function configureGitHubBot(ctx: BotConfigureContext): Promise<Reco
|
|
|
261
261
|
ctx.envVars.GITHUB_PERSONAL_ACCESS_TOKEN = pat;
|
|
262
262
|
}
|
|
263
263
|
|
|
264
|
-
return
|
|
264
|
+
return endpointConfig;
|
|
265
265
|
}
|
|
266
266
|
|
|
267
|
-
export async function configureOneBot11Bot(ctx:
|
|
267
|
+
export async function configureOneBot11Bot(ctx: EndpointConfigureContext): Promise<Record<string, unknown>> {
|
|
268
268
|
console.log(chalk.gray(' 文档: ' + adapterDocsUrl('onebot11')));
|
|
269
269
|
|
|
270
270
|
const { connection } = await inquirer.prompt([
|
|
@@ -273,27 +273,27 @@ export async function configureOneBot11Bot(ctx: BotConfigureContext): Promise<Re
|
|
|
273
273
|
name: 'connection',
|
|
274
274
|
message: ' 连接方式:',
|
|
275
275
|
choices: [
|
|
276
|
-
{ name: '正向 WebSocket (ws) — 本
|
|
276
|
+
{ name: '正向 WebSocket (ws) — 本 Endpoint 连接 OneBot 实现', value: 'ws' },
|
|
277
277
|
{ name: '反向 WebSocket (wss) — OneBot 实现连本 Bot(需 host-router)', value: 'wss' },
|
|
278
278
|
],
|
|
279
279
|
default: 'ws',
|
|
280
280
|
},
|
|
281
281
|
]);
|
|
282
282
|
|
|
283
|
-
const {
|
|
283
|
+
const { endpointName } = await inquirer.prompt([
|
|
284
284
|
{
|
|
285
285
|
type: 'input',
|
|
286
|
-
name: '
|
|
287
|
-
message: '
|
|
286
|
+
name: 'endpointName',
|
|
287
|
+
message: ' Endpoint 标识名称:',
|
|
288
288
|
default: 'onebot-bot',
|
|
289
289
|
validate: (v: string) => (v.trim() ? true : '名称不能为空'),
|
|
290
290
|
},
|
|
291
291
|
]);
|
|
292
292
|
|
|
293
|
-
const
|
|
293
|
+
const endpointConfig: Record<string, unknown> = {
|
|
294
294
|
context: 'onebot11',
|
|
295
295
|
connection,
|
|
296
|
-
name:
|
|
296
|
+
name: endpointName.trim(),
|
|
297
297
|
};
|
|
298
298
|
|
|
299
299
|
if (connection === 'ws') {
|
|
@@ -306,7 +306,7 @@ export async function configureOneBot11Bot(ctx: BotConfigureContext): Promise<Re
|
|
|
306
306
|
validate: (v: string) => (v.trim() ? true : '地址不能为空'),
|
|
307
307
|
},
|
|
308
308
|
]);
|
|
309
|
-
|
|
309
|
+
endpointConfig.url = url.trim();
|
|
310
310
|
} else {
|
|
311
311
|
console.log(chalk.gray(' 反向 WS 需启用 @zhin.js/host-router,OneBot 实现配置连接到此 Bot'));
|
|
312
312
|
const { path: wsPath } = await inquirer.prompt([
|
|
@@ -318,7 +318,7 @@ export async function configureOneBot11Bot(ctx: BotConfigureContext): Promise<Re
|
|
|
318
318
|
validate: (v: string) => (v.trim() ? true : '路径不能为空'),
|
|
319
319
|
},
|
|
320
320
|
]);
|
|
321
|
-
|
|
321
|
+
endpointConfig.path = wsPath.trim();
|
|
322
322
|
}
|
|
323
323
|
|
|
324
324
|
const { accessToken } = await inquirer.prompt([
|
|
@@ -331,20 +331,20 @@ export async function configureOneBot11Bot(ctx: BotConfigureContext): Promise<Re
|
|
|
331
331
|
]);
|
|
332
332
|
if (accessToken?.trim()) {
|
|
333
333
|
ctx.envVars.ONEBOT11_ACCESS_TOKEN = accessToken.trim();
|
|
334
|
-
|
|
334
|
+
endpointConfig.access_token = '${ONEBOT11_ACCESS_TOKEN}';
|
|
335
335
|
}
|
|
336
336
|
|
|
337
|
-
return
|
|
337
|
+
return endpointConfig;
|
|
338
338
|
}
|
|
339
339
|
|
|
340
|
-
export async function configureQQBot(ctx:
|
|
340
|
+
export async function configureQQBot(ctx: EndpointConfigureContext): Promise<Record<string, unknown>> {
|
|
341
341
|
console.log(chalk.gray(' 文档: ' + adapterDocsUrl('qq')));
|
|
342
342
|
|
|
343
343
|
const credentials = await inquirer.prompt([
|
|
344
344
|
{
|
|
345
345
|
type: 'input',
|
|
346
346
|
name: 'name',
|
|
347
|
-
message: '
|
|
347
|
+
message: ' Endpoint 标识名称:',
|
|
348
348
|
default: 'qq-bot',
|
|
349
349
|
validate: (v: string) => (v.trim() ? true : '名称不能为空'),
|
|
350
350
|
},
|
|
@@ -403,7 +403,7 @@ export async function configureQQBot(ctx: BotConfigureContext): Promise<Record<s
|
|
|
403
403
|
};
|
|
404
404
|
}
|
|
405
405
|
|
|
406
|
-
export async function
|
|
406
|
+
export async function configureDiscordEndpoint(ctx: EndpointConfigureContext): Promise<Record<string, unknown>> {
|
|
407
407
|
console.log(chalk.gray(' 文档: ' + adapterDocsUrl('discord')));
|
|
408
408
|
|
|
409
409
|
const { connection } = await inquirer.prompt([
|
|
@@ -419,27 +419,27 @@ export async function configureDiscordBot(ctx: BotConfigureContext): Promise<Rec
|
|
|
419
419
|
},
|
|
420
420
|
]);
|
|
421
421
|
|
|
422
|
-
const {
|
|
422
|
+
const { endpointName, token } = await inquirer.prompt([
|
|
423
423
|
{
|
|
424
424
|
type: 'input',
|
|
425
|
-
name: '
|
|
426
|
-
message: '
|
|
425
|
+
name: 'endpointName',
|
|
426
|
+
message: ' Endpoint 标识名称:',
|
|
427
427
|
default: 'discord-bot',
|
|
428
428
|
validate: (v: string) => (v.trim() ? true : '名称不能为空'),
|
|
429
429
|
},
|
|
430
430
|
{
|
|
431
431
|
type: 'password',
|
|
432
432
|
name: 'token',
|
|
433
|
-
message: '
|
|
433
|
+
message: ' Endpoint Token:',
|
|
434
434
|
validate: (v: string) => (v.trim() ? true : 'Token 不能为空'),
|
|
435
435
|
},
|
|
436
436
|
]);
|
|
437
437
|
ctx.envVars.DISCORD_TOKEN = token;
|
|
438
438
|
|
|
439
|
-
const
|
|
439
|
+
const endpointConfig: Record<string, unknown> = {
|
|
440
440
|
context: 'discord',
|
|
441
441
|
connection,
|
|
442
|
-
name:
|
|
442
|
+
name: endpointName.trim(),
|
|
443
443
|
token: '${DISCORD_TOKEN}',
|
|
444
444
|
};
|
|
445
445
|
|
|
@@ -465,15 +465,15 @@ export async function configureDiscordBot(ctx: BotConfigureContext): Promise<Rec
|
|
|
465
465
|
default: '/discord/interactions',
|
|
466
466
|
},
|
|
467
467
|
]);
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
468
|
+
endpointConfig.applicationId = interactions.applicationId.trim();
|
|
469
|
+
endpointConfig.publicKey = interactions.publicKey.trim();
|
|
470
|
+
endpointConfig.interactionsPath = interactions.interactionsPath.trim();
|
|
471
471
|
}
|
|
472
472
|
|
|
473
|
-
return
|
|
473
|
+
return endpointConfig;
|
|
474
474
|
}
|
|
475
475
|
|
|
476
|
-
export async function
|
|
476
|
+
export async function configureSlackEndpoint(ctx: EndpointConfigureContext): Promise<Record<string, unknown>> {
|
|
477
477
|
console.log(chalk.gray(' 文档: ' + adapterDocsUrl('slack')));
|
|
478
478
|
|
|
479
479
|
const { socketMode } = await inquirer.prompt([
|
|
@@ -489,18 +489,18 @@ export async function configureSlackBot(ctx: BotConfigureContext): Promise<Recor
|
|
|
489
489
|
},
|
|
490
490
|
]);
|
|
491
491
|
|
|
492
|
-
const {
|
|
492
|
+
const { endpointName, token, signingSecret } = await inquirer.prompt([
|
|
493
493
|
{
|
|
494
494
|
type: 'input',
|
|
495
|
-
name: '
|
|
496
|
-
message: '
|
|
495
|
+
name: 'endpointName',
|
|
496
|
+
message: ' Endpoint 标识名称:',
|
|
497
497
|
default: 'slack-bot',
|
|
498
498
|
validate: (v: string) => (v.trim() ? true : '名称不能为空'),
|
|
499
499
|
},
|
|
500
500
|
{
|
|
501
501
|
type: 'password',
|
|
502
502
|
name: 'token',
|
|
503
|
-
message: '
|
|
503
|
+
message: ' Endpoint Token (xoxb-...):',
|
|
504
504
|
validate: (v: string) => (v.trim() ? true : '不能为空'),
|
|
505
505
|
},
|
|
506
506
|
{
|
|
@@ -514,9 +514,9 @@ export async function configureSlackBot(ctx: BotConfigureContext): Promise<Recor
|
|
|
514
514
|
ctx.envVars.SLACK_BOT_TOKEN = token;
|
|
515
515
|
ctx.envVars.SLACK_SIGNING_SECRET = signingSecret;
|
|
516
516
|
|
|
517
|
-
const
|
|
517
|
+
const endpointConfig: Record<string, unknown> = {
|
|
518
518
|
context: 'slack',
|
|
519
|
-
name:
|
|
519
|
+
name: endpointName.trim(),
|
|
520
520
|
token: '${SLACK_BOT_TOKEN}',
|
|
521
521
|
signingSecret: '${SLACK_SIGNING_SECRET}',
|
|
522
522
|
socketMode: socketMode === 'true',
|
|
@@ -532,7 +532,7 @@ export async function configureSlackBot(ctx: BotConfigureContext): Promise<Recor
|
|
|
532
532
|
},
|
|
533
533
|
]);
|
|
534
534
|
ctx.envVars.SLACK_APP_TOKEN = appToken;
|
|
535
|
-
|
|
535
|
+
endpointConfig.appToken = '${SLACK_APP_TOKEN}';
|
|
536
536
|
} else {
|
|
537
537
|
console.log(chalk.yellow(' HTTP 模式需公网可达并配置 Slack Event Subscriptions URL'));
|
|
538
538
|
const { port } = await inquirer.prompt([
|
|
@@ -543,8 +543,8 @@ export async function configureSlackBot(ctx: BotConfigureContext): Promise<Recor
|
|
|
543
543
|
default: '3000',
|
|
544
544
|
},
|
|
545
545
|
]);
|
|
546
|
-
|
|
546
|
+
endpointConfig.port = parseInt(port, 10);
|
|
547
547
|
}
|
|
548
548
|
|
|
549
|
-
return
|
|
549
|
+
return endpointConfig;
|
|
550
550
|
}
|