@zhin.js/scaffold-wizard 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.d.ts +4 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/lib/optional-peers.d.ts +21 -0
- package/lib/optional-peers.d.ts.map +1 -0
- package/lib/optional-peers.js +104 -0
- package/lib/optional-peers.js.map +1 -0
- package/lib/project-deps.d.ts +2 -2
- package/lib/project-deps.d.ts.map +1 -1
- package/lib/project-deps.js +13 -13
- package/lib/project-deps.js.map +1 -1
- package/lib/upgrade-l4.d.ts +15 -0
- package/lib/upgrade-l4.d.ts.map +1 -0
- package/lib/upgrade-l4.js +68 -0
- package/lib/upgrade-l4.js.map +1 -0
- package/package.json +1 -1
- package/src/index.ts +16 -0
- package/src/optional-peers.ts +149 -0
- package/src/project-deps.ts +13 -13
- package/src/upgrade-l4.ts +102 -0
package/lib/index.d.ts
CHANGED
|
@@ -7,5 +7,9 @@ export type { AISetupConfig } from './ai.js';
|
|
|
7
7
|
export { configureAI, generateAIEnvVars, generateAIConfigYaml, generateAIConfigJSON, generateAIConfigToml, RECOMMENDED_AI_DEFAULTS, } from './ai.js';
|
|
8
8
|
export { configureDatabaseOptions } from './database.js';
|
|
9
9
|
export { MCP_SDK_VERSION, getAIDependencies, listAIDependencyNames, formatAIDependencyHint, isAiEnabledInConfig, resolveDefaultProviderFromConfig, getRequiredAIDependenciesForConfig, diagnoseAIDependencies, formatAIDependencyFixCommand, ensureDatabaseForAI, ensureDatabaseForAdapters, } from './project-deps.js';
|
|
10
|
+
export { SPEECH_PACKAGE, HTML_RENDERER_PACKAGE, ADAPTERS_PREFER_HTML_IMAGE, diagnoseOptionalPeers, formatOptionalPeerFixCommand, getOptionalPeerDependencies, } from './optional-peers.js';
|
|
11
|
+
export type { OptionalPeerDiagnosis, OptionalPeersDiagnosis } from './optional-peers.js';
|
|
12
|
+
export { diagnoseUpgradeToL4, getUpgradeToL4Dependencies, } from './upgrade-l4.js';
|
|
13
|
+
export type { UpgradeToL4Diagnosis } from './upgrade-l4.js';
|
|
10
14
|
export { CONSOLE_HOST_PLUGINS, applyDatabaseToConfig, applyAdaptersToConfig, applyAIToConfig, appendWizardEnvVars, collectWizardDependencies, mergeDependenciesIntoPackageJson, finalizeWizardOptions, applyWizardOptionsToConfig, } from './apply.js';
|
|
11
15
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,2BAA2B,EAC3B,2BAA2B,EAC3B,2BAA2B,EAC3B,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAElC,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAEzD,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,gCAAgC,EAChC,kCAAkC,EAClC,sBAAsB,EACtB,4BAA4B,EAC5B,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,yBAAyB,EACzB,gCAAgC,EAChC,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,2BAA2B,EAC3B,2BAA2B,EAC3B,2BAA2B,EAC3B,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAElC,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAEzD,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,gCAAgC,EAChC,kCAAkC,EAClC,sBAAsB,EACtB,4BAA4B,EAC5B,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,4BAA4B,EAC5B,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAEzF,OAAO,EACL,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE5D,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,yBAAyB,EACzB,gCAAgC,EAChC,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,YAAY,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -4,5 +4,7 @@ export { ADAPTERS_DOCS_URL, ADAPTERS_INDEX_URL, ADAPTERS_ESSENTIALS_URL, adapter
|
|
|
4
4
|
export { configureAI, generateAIEnvVars, generateAIConfigYaml, generateAIConfigJSON, generateAIConfigToml, RECOMMENDED_AI_DEFAULTS, } from './ai.js';
|
|
5
5
|
export { configureDatabaseOptions } from './database.js';
|
|
6
6
|
export { MCP_SDK_VERSION, getAIDependencies, listAIDependencyNames, formatAIDependencyHint, isAiEnabledInConfig, resolveDefaultProviderFromConfig, getRequiredAIDependenciesForConfig, diagnoseAIDependencies, formatAIDependencyFixCommand, ensureDatabaseForAI, ensureDatabaseForAdapters, } from './project-deps.js';
|
|
7
|
+
export { SPEECH_PACKAGE, HTML_RENDERER_PACKAGE, ADAPTERS_PREFER_HTML_IMAGE, diagnoseOptionalPeers, formatOptionalPeerFixCommand, getOptionalPeerDependencies, } from './optional-peers.js';
|
|
8
|
+
export { diagnoseUpgradeToL4, getUpgradeToL4Dependencies, } from './upgrade-l4.js';
|
|
7
9
|
export { CONSOLE_HOST_PLUGINS, applyDatabaseToConfig, applyAdaptersToConfig, applyAIToConfig, appendWizardEnvVars, collectWizardDependencies, mergeDependenciesIntoPackageJson, finalizeWizardOptions, applyWizardOptionsToConfig, } from './apply.js';
|
|
8
10
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,2BAA2B,EAC3B,2BAA2B,EAC3B,2BAA2B,EAC3B,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAEzD,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,gCAAgC,EAChC,kCAAkC,EAClC,sBAAsB,EACtB,4BAA4B,EAC5B,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,yBAAyB,EACzB,gCAAgC,EAChC,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,2BAA2B,EAC3B,2BAA2B,EAC3B,2BAA2B,EAC3B,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAEzD,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,gCAAgC,EAChC,kCAAkC,EAClC,sBAAsB,EACtB,4BAA4B,EAC5B,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,4BAA4B,EAC5B,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,yBAAyB,EACzB,gCAAgC,EAChC,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { PackageJsonLike } from './project-deps.js';
|
|
2
|
+
export declare const SPEECH_PACKAGE = "@zhin.js/speech";
|
|
3
|
+
export declare const HTML_RENDERER_PACKAGE = "@zhin.js/html-renderer";
|
|
4
|
+
/** 默认 html/markdown policy 为 image 的 adapter context 名 */
|
|
5
|
+
export declare const ADAPTERS_PREFER_HTML_IMAGE: Set<string>;
|
|
6
|
+
export interface OptionalPeerDiagnosis {
|
|
7
|
+
packageName: string;
|
|
8
|
+
required: boolean;
|
|
9
|
+
reason: string;
|
|
10
|
+
missingFromPackageJson: string[];
|
|
11
|
+
notInstalled: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface OptionalPeersDiagnosis {
|
|
14
|
+
speech?: OptionalPeerDiagnosis;
|
|
15
|
+
htmlRenderer?: OptionalPeerDiagnosis;
|
|
16
|
+
}
|
|
17
|
+
/** 按 zhin.config 推断 optional peer(speech / html-renderer)是否应安装 */
|
|
18
|
+
export declare function diagnoseOptionalPeers(cwd: string, config: Record<string, unknown>, pkg?: PackageJsonLike): OptionalPeersDiagnosis;
|
|
19
|
+
export declare function formatOptionalPeerFixCommand(diagnosis: OptionalPeerDiagnosis): string;
|
|
20
|
+
export declare function getOptionalPeerDependencies(config: Record<string, unknown>): Record<string, string>;
|
|
21
|
+
//# sourceMappingURL=optional-peers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optional-peers.d.ts","sourceRoot":"","sources":["../src/optional-peers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAMzD,eAAO,MAAM,cAAc,oBAAoB,CAAC;AAChD,eAAO,MAAM,qBAAqB,2BAA2B,CAAC;AAI9D,0DAA0D;AAC1D,eAAO,MAAM,0BAA0B,aAKrC,CAAC;AAEH,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,YAAY,CAAC,EAAE,qBAAqB,CAAC;CACtC;AAsDD,kEAAkE;AAClE,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,GAAG,CAAC,EAAE,eAAe,GACpB,sBAAsB,CAuCxB;AAED,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,qBAAqB,GAAG,MAAM,CAQrF;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMnG"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { findMissingPackageDependencies, findUnresolvedPackageInstalls, } from './project-deps.js';
|
|
4
|
+
export const SPEECH_PACKAGE = '@zhin.js/speech';
|
|
5
|
+
export const HTML_RENDERER_PACKAGE = '@zhin.js/html-renderer';
|
|
6
|
+
const PEER_VERSION = 'latest';
|
|
7
|
+
/** 默认 html/markdown policy 为 image 的 adapter context 名 */
|
|
8
|
+
export const ADAPTERS_PREFER_HTML_IMAGE = new Set([
|
|
9
|
+
'kook',
|
|
10
|
+
'qq',
|
|
11
|
+
'weixin-ilink',
|
|
12
|
+
'email',
|
|
13
|
+
]);
|
|
14
|
+
function readSpeechStrategy(config) {
|
|
15
|
+
const ai = config.ai;
|
|
16
|
+
if (!ai || typeof ai !== 'object' || Array.isArray(ai))
|
|
17
|
+
return undefined;
|
|
18
|
+
const multimodal = ai.multimodal;
|
|
19
|
+
if (!multimodal || typeof multimodal !== 'object' || Array.isArray(multimodal))
|
|
20
|
+
return undefined;
|
|
21
|
+
const audio = multimodal.audio;
|
|
22
|
+
if (!audio || typeof audio !== 'object' || Array.isArray(audio))
|
|
23
|
+
return undefined;
|
|
24
|
+
const strategy = audio.strategy;
|
|
25
|
+
return strategy != null ? String(strategy) : undefined;
|
|
26
|
+
}
|
|
27
|
+
function configUsesHtmlImageAdapter(config) {
|
|
28
|
+
const plugins = Array.isArray(config.plugins)
|
|
29
|
+
? config.plugins.filter((p) => typeof p === 'string')
|
|
30
|
+
: [];
|
|
31
|
+
for (const plugin of plugins) {
|
|
32
|
+
for (const ctx of ADAPTERS_PREFER_HTML_IMAGE) {
|
|
33
|
+
if (plugin.includes(`adapter-${ctx}`))
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const endpoints = Array.isArray(config.endpoints) ? config.endpoints : [];
|
|
38
|
+
for (const ep of endpoints) {
|
|
39
|
+
if (!ep || typeof ep !== 'object' || Array.isArray(ep))
|
|
40
|
+
continue;
|
|
41
|
+
const context = ep.context;
|
|
42
|
+
if (typeof context === 'string' && ADAPTERS_PREFER_HTML_IMAGE.has(context)) {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
function diagnosePeer(cwd, pkg, packageName, required, reason) {
|
|
49
|
+
if (!required)
|
|
50
|
+
return undefined;
|
|
51
|
+
const requiredDeps = { [packageName]: PEER_VERSION };
|
|
52
|
+
const missingFromPackageJson = findMissingPackageDependencies(pkg, requiredDeps);
|
|
53
|
+
const declared = [packageName].filter((n) => !missingFromPackageJson.includes(n));
|
|
54
|
+
const notInstalled = findUnresolvedPackageInstalls(cwd, declared);
|
|
55
|
+
return {
|
|
56
|
+
packageName,
|
|
57
|
+
required: true,
|
|
58
|
+
reason,
|
|
59
|
+
missingFromPackageJson,
|
|
60
|
+
notInstalled,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/** 按 zhin.config 推断 optional peer(speech / html-renderer)是否应安装 */
|
|
64
|
+
export function diagnoseOptionalPeers(cwd, config, pkg) {
|
|
65
|
+
const packageJsonPath = path.join(cwd, 'package.json');
|
|
66
|
+
const packageJson = pkg ?? (fs.existsSync(packageJsonPath)
|
|
67
|
+
? fs.readJsonSync(packageJsonPath)
|
|
68
|
+
: {});
|
|
69
|
+
const speechRequired = config.speech != null && typeof config.speech === 'object'
|
|
70
|
+
|| readSpeechStrategy(config) === 'transcribe';
|
|
71
|
+
const htmlRendererRequired = config.htmlRenderer != null && typeof config.htmlRenderer === 'object'
|
|
72
|
+
|| configUsesHtmlImageAdapter(config);
|
|
73
|
+
const speech = diagnosePeer(cwd, packageJson, SPEECH_PACKAGE, speechRequired, speechRequired
|
|
74
|
+
? (readSpeechStrategy(config) === 'transcribe'
|
|
75
|
+
? 'ai.multimodal.audio.strategy 为 transcribe'
|
|
76
|
+
: '已配置 speech:')
|
|
77
|
+
: '');
|
|
78
|
+
const htmlRenderer = diagnosePeer(cwd, packageJson, HTML_RENDERER_PACKAGE, htmlRendererRequired, htmlRendererRequired
|
|
79
|
+
? (config.htmlRenderer != null
|
|
80
|
+
? '已配置 htmlRenderer:'
|
|
81
|
+
: 'adapter 出站 policy 使用 html/markdown→image')
|
|
82
|
+
: '');
|
|
83
|
+
return { speech, htmlRenderer };
|
|
84
|
+
}
|
|
85
|
+
export function formatOptionalPeerFixCommand(diagnosis) {
|
|
86
|
+
const missing = [
|
|
87
|
+
...diagnosis.missingFromPackageJson,
|
|
88
|
+
...diagnosis.notInstalled.filter((n) => !diagnosis.missingFromPackageJson.includes(n)),
|
|
89
|
+
];
|
|
90
|
+
const unique = [...new Set(missing)];
|
|
91
|
+
if (unique.length === 0)
|
|
92
|
+
return 'pnpm install';
|
|
93
|
+
return `pnpm add ${unique.map((n) => `${n}@${PEER_VERSION}`).join(' ')}`;
|
|
94
|
+
}
|
|
95
|
+
export function getOptionalPeerDependencies(config) {
|
|
96
|
+
const peers = diagnoseOptionalPeers(process.cwd(), config);
|
|
97
|
+
const deps = {};
|
|
98
|
+
if (peers.speech?.required)
|
|
99
|
+
deps[SPEECH_PACKAGE] = PEER_VERSION;
|
|
100
|
+
if (peers.htmlRenderer?.required)
|
|
101
|
+
deps[HTML_RENDERER_PACKAGE] = PEER_VERSION;
|
|
102
|
+
return deps;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=optional-peers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optional-peers.js","sourceRoot":"","sources":["../src/optional-peers.ts"],"names":[],"mappings":"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"}
|
package/lib/project-deps.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AISetupConfig } from './ai.js';
|
|
2
2
|
import type { InitOptions } from './types.js';
|
|
3
|
-
/**
|
|
4
|
-
export declare const MCP_SDK_VERSION = "
|
|
3
|
+
/** 新项目依赖默认接受 npm latest 漂移,避免脚手架维护固定版本表。 */
|
|
4
|
+
export declare const MCP_SDK_VERSION = "latest";
|
|
5
5
|
/** 启用 AI 时将写入 package.json 的依赖名(用于向导提示与 CLI 输出) */
|
|
6
6
|
export declare function listAIDependencyNames(provider?: string, options?: {
|
|
7
7
|
includeMcp?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-deps.d.ts","sourceRoot":"","sources":["../src/project-deps.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,
|
|
1
|
+
{"version":3,"file":"project-deps.d.ts","sourceRoot":"","sources":["../src/project-deps.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,4CAA4C;AAC5C,eAAO,MAAM,eAAe,WAAW,CAAC;AAsBxC,mDAAmD;AACnD,wBAAgB,qBAAqB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,EAAE,CAUrG;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAEpG;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED,oEAAoE;AACpE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAAE,EAAE,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAerE;AAED,wBAAgB,gCAAgC,CAAC,MAAM,EAAE;IAAE,EAAE,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,GAAG,SAAS,CAkB7F;AAQD,gDAAgD;AAChD,wBAAgB,kCAAkC,CAAC,MAAM,EAAE;IAAE,EAAE,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAanG;AAED,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,eAAe,EACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,MAAM,EAAE,CAMV;AAED,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAa3F;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,IAAI,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE;IAAE,EAAE,CAAC,EAAE,OAAO,CAAA;CAAE,EACxB,GAAG,CAAC,EAAE,eAAe,GACpB,qBAAqB,GAAG,IAAI,CAe9B;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAIxG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgB5E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAa9D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAUpE"}
|
package/lib/project-deps.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';
|
|
2
2
|
import fs from 'fs-extra';
|
|
3
3
|
import path from 'node:path';
|
|
4
|
-
/**
|
|
5
|
-
export const MCP_SDK_VERSION = '
|
|
6
|
-
const AI_STACK_VERSION = '
|
|
7
|
-
const ZOD_VERSION = '
|
|
8
|
-
const VERCEL_AI_VERSION = '
|
|
4
|
+
/** 新项目依赖默认接受 npm latest 漂移,避免脚手架维护固定版本表。 */
|
|
5
|
+
export const MCP_SDK_VERSION = 'latest';
|
|
6
|
+
const AI_STACK_VERSION = 'latest';
|
|
7
|
+
const ZOD_VERSION = 'latest';
|
|
8
|
+
const VERCEL_AI_VERSION = 'latest';
|
|
9
9
|
const PROVIDER_SDK_PACKAGES = {
|
|
10
|
-
openai: { pkg: '@ai-sdk/openai', version: '
|
|
11
|
-
anthropic: { pkg: '@ai-sdk/anthropic', version: '
|
|
12
|
-
google: { pkg: '@ai-sdk/google', version: '
|
|
13
|
-
gemini: { pkg: '@ai-sdk/google', version: '
|
|
14
|
-
deepseek: { pkg: '@ai-sdk/deepseek', version: '
|
|
15
|
-
ollama: { pkg: '@ai-sdk/openai-compatible', version: '
|
|
16
|
-
moonshot: { pkg: '@ai-sdk/openai-compatible', version: '
|
|
17
|
-
zhipu: { pkg: '@ai-sdk/openai-compatible', version: '
|
|
10
|
+
openai: { pkg: '@ai-sdk/openai', version: 'latest' },
|
|
11
|
+
anthropic: { pkg: '@ai-sdk/anthropic', version: 'latest' },
|
|
12
|
+
google: { pkg: '@ai-sdk/google', version: 'latest' },
|
|
13
|
+
gemini: { pkg: '@ai-sdk/google', version: 'latest' },
|
|
14
|
+
deepseek: { pkg: '@ai-sdk/deepseek', version: 'latest' },
|
|
15
|
+
ollama: { pkg: '@ai-sdk/openai-compatible', version: 'latest' },
|
|
16
|
+
moonshot: { pkg: '@ai-sdk/openai-compatible', version: 'latest' },
|
|
17
|
+
zhipu: { pkg: '@ai-sdk/openai-compatible', version: 'latest' },
|
|
18
18
|
};
|
|
19
19
|
function providerSdkPackage(provider) {
|
|
20
20
|
if (!provider)
|
package/lib/project-deps.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-deps.js","sourceRoot":"","sources":["../src/project-deps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,
|
|
1
|
+
{"version":3,"file":"project-deps.js","sourceRoot":"","sources":["../src/project-deps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { PackageJsonLike } from './project-deps.js';
|
|
2
|
+
import { diagnoseAIDependencies } from './project-deps.js';
|
|
3
|
+
import { diagnoseOptionalPeers } from './optional-peers.js';
|
|
4
|
+
export interface UpgradeToL4Diagnosis {
|
|
5
|
+
ai: ReturnType<typeof diagnoseAIDependencies>;
|
|
6
|
+
optionalPeers: ReturnType<typeof diagnoseOptionalPeers>;
|
|
7
|
+
missingAiDeps: string[];
|
|
8
|
+
missingOptionalPeers: string[];
|
|
9
|
+
fixCommand: string;
|
|
10
|
+
configSnippets: string[];
|
|
11
|
+
}
|
|
12
|
+
/** minimal-bot → full-bot / L4 升级诊断 */
|
|
13
|
+
export declare function diagnoseUpgradeToL4(cwd: string, config: Record<string, unknown>, pkg?: PackageJsonLike): UpgradeToL4Diagnosis;
|
|
14
|
+
export declare function getUpgradeToL4Dependencies(config: Record<string, unknown>): Record<string, string>;
|
|
15
|
+
//# sourceMappingURL=upgrade-l4.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade-l4.d.ts","sourceRoot":"","sources":["../src/upgrade-l4.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EACL,sBAAsB,EAMvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,qBAAqB,EAA6D,MAAM,qBAAqB,CAAC;AAEvH,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;IAC9C,aAAa,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;IACxD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAkBD,uCAAuC;AACvC,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,GAAG,CAAC,EAAE,eAAe,GACpB,oBAAoB,CAqDtB;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGlG"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { diagnoseAIDependencies, formatAIDependencyFixCommand, getRequiredAIDependenciesForConfig, isAiEnabledInConfig, findMissingPackageDependencies, findUnresolvedPackageInstalls, } from './project-deps.js';
|
|
4
|
+
import { diagnoseOptionalPeers, formatOptionalPeerFixCommand, getOptionalPeerDependencies } from './optional-peers.js';
|
|
5
|
+
const L4_CONFIG_SNIPPETS = [
|
|
6
|
+
'# --- L4 可选多模态(取消注释并安装 optional peer)---',
|
|
7
|
+
'# ai:',
|
|
8
|
+
'# multimodal:',
|
|
9
|
+
'# audio:',
|
|
10
|
+
'# strategy: transcribe # 需 @zhin.js/speech',
|
|
11
|
+
'# speech:',
|
|
12
|
+
'# stt:',
|
|
13
|
+
'# provider: ollama',
|
|
14
|
+
'# model: whisper',
|
|
15
|
+
'# tts:',
|
|
16
|
+
'# provider: edge',
|
|
17
|
+
'# htmlRenderer:',
|
|
18
|
+
'# width: 540',
|
|
19
|
+
];
|
|
20
|
+
/** minimal-bot → full-bot / L4 升级诊断 */
|
|
21
|
+
export function diagnoseUpgradeToL4(cwd, config, pkg) {
|
|
22
|
+
const packageJsonPath = path.join(cwd, 'package.json');
|
|
23
|
+
const packageJson = pkg ?? (fs.existsSync(packageJsonPath)
|
|
24
|
+
? fs.readJsonSync(packageJsonPath)
|
|
25
|
+
: {});
|
|
26
|
+
const aiEnabled = isAiEnabledInConfig(config);
|
|
27
|
+
const ai = aiEnabled ? diagnoseAIDependencies(cwd, config, packageJson) : null;
|
|
28
|
+
const optionalPeers = diagnoseOptionalPeers(cwd, config, packageJson);
|
|
29
|
+
const missingAiDeps = ai
|
|
30
|
+
? [...new Set([...ai.missingFromPackageJson, ...ai.notInstalled])]
|
|
31
|
+
: [...Object.keys(getRequiredAIDependenciesForConfig({ ai: { enabled: true } }))];
|
|
32
|
+
if (!aiEnabled) {
|
|
33
|
+
const required = getRequiredAIDependenciesForConfig({ ai: { enabled: true } });
|
|
34
|
+
const fromPkg = findMissingPackageDependencies(packageJson, required);
|
|
35
|
+
const declared = Object.keys(required).filter((n) => !fromPkg.includes(n));
|
|
36
|
+
const notInstalled = findUnresolvedPackageInstalls(cwd, declared);
|
|
37
|
+
missingAiDeps.push(...fromPkg, ...notInstalled);
|
|
38
|
+
}
|
|
39
|
+
const missingOptionalPeers = [];
|
|
40
|
+
for (const peer of [optionalPeers.speech, optionalPeers.htmlRenderer]) {
|
|
41
|
+
if (!peer?.required)
|
|
42
|
+
continue;
|
|
43
|
+
missingOptionalPeers.push(...peer.missingFromPackageJson, ...peer.notInstalled.filter((n) => !peer.missingFromPackageJson.includes(n)));
|
|
44
|
+
}
|
|
45
|
+
const fixParts = [];
|
|
46
|
+
if (!aiEnabled || missingAiDeps.length > 0) {
|
|
47
|
+
const required = ai?.required ?? getRequiredAIDependenciesForConfig({ ai: { enabled: true } });
|
|
48
|
+
fixParts.push(formatAIDependencyFixCommand([...new Set(missingAiDeps)], required));
|
|
49
|
+
}
|
|
50
|
+
for (const peer of [optionalPeers.speech, optionalPeers.htmlRenderer]) {
|
|
51
|
+
if (peer && (peer.missingFromPackageJson.length > 0 || peer.notInstalled.length > 0)) {
|
|
52
|
+
fixParts.push(formatOptionalPeerFixCommand(peer));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
ai,
|
|
57
|
+
optionalPeers,
|
|
58
|
+
missingAiDeps: [...new Set(missingAiDeps)],
|
|
59
|
+
missingOptionalPeers: [...new Set(missingOptionalPeers)],
|
|
60
|
+
fixCommand: fixParts.join(' && '),
|
|
61
|
+
configSnippets: L4_CONFIG_SNIPPETS,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export function getUpgradeToL4Dependencies(config) {
|
|
65
|
+
const deps = getRequiredAIDependenciesForConfig({ ai: { enabled: true } });
|
|
66
|
+
return { ...deps, ...getOptionalPeerDependencies(config) };
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=upgrade-l4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade-l4.js","sourceRoot":"","sources":["../src/upgrade-l4.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -45,6 +45,22 @@ export {
|
|
|
45
45
|
ensureDatabaseForAdapters,
|
|
46
46
|
} from './project-deps.js';
|
|
47
47
|
|
|
48
|
+
export {
|
|
49
|
+
SPEECH_PACKAGE,
|
|
50
|
+
HTML_RENDERER_PACKAGE,
|
|
51
|
+
ADAPTERS_PREFER_HTML_IMAGE,
|
|
52
|
+
diagnoseOptionalPeers,
|
|
53
|
+
formatOptionalPeerFixCommand,
|
|
54
|
+
getOptionalPeerDependencies,
|
|
55
|
+
} from './optional-peers.js';
|
|
56
|
+
export type { OptionalPeerDiagnosis, OptionalPeersDiagnosis } from './optional-peers.js';
|
|
57
|
+
|
|
58
|
+
export {
|
|
59
|
+
diagnoseUpgradeToL4,
|
|
60
|
+
getUpgradeToL4Dependencies,
|
|
61
|
+
} from './upgrade-l4.js';
|
|
62
|
+
export type { UpgradeToL4Diagnosis } from './upgrade-l4.js';
|
|
63
|
+
|
|
48
64
|
export {
|
|
49
65
|
CONSOLE_HOST_PLUGINS,
|
|
50
66
|
applyDatabaseToConfig,
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import type { PackageJsonLike } from './project-deps.js';
|
|
4
|
+
import {
|
|
5
|
+
findMissingPackageDependencies,
|
|
6
|
+
findUnresolvedPackageInstalls,
|
|
7
|
+
} from './project-deps.js';
|
|
8
|
+
|
|
9
|
+
export const SPEECH_PACKAGE = '@zhin.js/speech';
|
|
10
|
+
export const HTML_RENDERER_PACKAGE = '@zhin.js/html-renderer';
|
|
11
|
+
|
|
12
|
+
const PEER_VERSION = 'latest';
|
|
13
|
+
|
|
14
|
+
/** 默认 html/markdown policy 为 image 的 adapter context 名 */
|
|
15
|
+
export const ADAPTERS_PREFER_HTML_IMAGE = new Set([
|
|
16
|
+
'kook',
|
|
17
|
+
'qq',
|
|
18
|
+
'weixin-ilink',
|
|
19
|
+
'email',
|
|
20
|
+
]);
|
|
21
|
+
|
|
22
|
+
export interface OptionalPeerDiagnosis {
|
|
23
|
+
packageName: string;
|
|
24
|
+
required: boolean;
|
|
25
|
+
reason: string;
|
|
26
|
+
missingFromPackageJson: string[];
|
|
27
|
+
notInstalled: string[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface OptionalPeersDiagnosis {
|
|
31
|
+
speech?: OptionalPeerDiagnosis;
|
|
32
|
+
htmlRenderer?: OptionalPeerDiagnosis;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function readSpeechStrategy(config: Record<string, unknown>): string | undefined {
|
|
36
|
+
const ai = config.ai;
|
|
37
|
+
if (!ai || typeof ai !== 'object' || Array.isArray(ai)) return undefined;
|
|
38
|
+
const multimodal = (ai as Record<string, unknown>).multimodal;
|
|
39
|
+
if (!multimodal || typeof multimodal !== 'object' || Array.isArray(multimodal)) return undefined;
|
|
40
|
+
const audio = (multimodal as Record<string, unknown>).audio;
|
|
41
|
+
if (!audio || typeof audio !== 'object' || Array.isArray(audio)) return undefined;
|
|
42
|
+
const strategy = (audio as Record<string, unknown>).strategy;
|
|
43
|
+
return strategy != null ? String(strategy) : undefined;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function configUsesHtmlImageAdapter(config: Record<string, unknown>): boolean {
|
|
47
|
+
const plugins = Array.isArray(config.plugins)
|
|
48
|
+
? config.plugins.filter((p): p is string => typeof p === 'string')
|
|
49
|
+
: [];
|
|
50
|
+
for (const plugin of plugins) {
|
|
51
|
+
for (const ctx of ADAPTERS_PREFER_HTML_IMAGE) {
|
|
52
|
+
if (plugin.includes(`adapter-${ctx}`)) return true;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const endpoints = Array.isArray(config.endpoints) ? config.endpoints : [];
|
|
56
|
+
for (const ep of endpoints) {
|
|
57
|
+
if (!ep || typeof ep !== 'object' || Array.isArray(ep)) continue;
|
|
58
|
+
const context = (ep as Record<string, unknown>).context;
|
|
59
|
+
if (typeof context === 'string' && ADAPTERS_PREFER_HTML_IMAGE.has(context)) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function diagnosePeer(
|
|
67
|
+
cwd: string,
|
|
68
|
+
pkg: PackageJsonLike,
|
|
69
|
+
packageName: string,
|
|
70
|
+
required: boolean,
|
|
71
|
+
reason: string,
|
|
72
|
+
): OptionalPeerDiagnosis | undefined {
|
|
73
|
+
if (!required) return undefined;
|
|
74
|
+
const requiredDeps = { [packageName]: PEER_VERSION };
|
|
75
|
+
const missingFromPackageJson = findMissingPackageDependencies(pkg, requiredDeps);
|
|
76
|
+
const declared = [packageName].filter((n) => !missingFromPackageJson.includes(n));
|
|
77
|
+
const notInstalled = findUnresolvedPackageInstalls(cwd, declared);
|
|
78
|
+
return {
|
|
79
|
+
packageName,
|
|
80
|
+
required: true,
|
|
81
|
+
reason,
|
|
82
|
+
missingFromPackageJson,
|
|
83
|
+
notInstalled,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** 按 zhin.config 推断 optional peer(speech / html-renderer)是否应安装 */
|
|
88
|
+
export function diagnoseOptionalPeers(
|
|
89
|
+
cwd: string,
|
|
90
|
+
config: Record<string, unknown>,
|
|
91
|
+
pkg?: PackageJsonLike,
|
|
92
|
+
): OptionalPeersDiagnosis {
|
|
93
|
+
const packageJsonPath = path.join(cwd, 'package.json');
|
|
94
|
+
const packageJson = pkg ?? (fs.existsSync(packageJsonPath)
|
|
95
|
+
? fs.readJsonSync(packageJsonPath) as PackageJsonLike
|
|
96
|
+
: {});
|
|
97
|
+
|
|
98
|
+
const speechRequired =
|
|
99
|
+
config.speech != null && typeof config.speech === 'object'
|
|
100
|
+
|| readSpeechStrategy(config) === 'transcribe';
|
|
101
|
+
|
|
102
|
+
const htmlRendererRequired =
|
|
103
|
+
config.htmlRenderer != null && typeof config.htmlRenderer === 'object'
|
|
104
|
+
|| configUsesHtmlImageAdapter(config);
|
|
105
|
+
|
|
106
|
+
const speech = diagnosePeer(
|
|
107
|
+
cwd,
|
|
108
|
+
packageJson,
|
|
109
|
+
SPEECH_PACKAGE,
|
|
110
|
+
speechRequired,
|
|
111
|
+
speechRequired
|
|
112
|
+
? (readSpeechStrategy(config) === 'transcribe'
|
|
113
|
+
? 'ai.multimodal.audio.strategy 为 transcribe'
|
|
114
|
+
: '已配置 speech:')
|
|
115
|
+
: '',
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
const htmlRenderer = diagnosePeer(
|
|
119
|
+
cwd,
|
|
120
|
+
packageJson,
|
|
121
|
+
HTML_RENDERER_PACKAGE,
|
|
122
|
+
htmlRendererRequired,
|
|
123
|
+
htmlRendererRequired
|
|
124
|
+
? (config.htmlRenderer != null
|
|
125
|
+
? '已配置 htmlRenderer:'
|
|
126
|
+
: 'adapter 出站 policy 使用 html/markdown→image')
|
|
127
|
+
: '',
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
return { speech, htmlRenderer };
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export function formatOptionalPeerFixCommand(diagnosis: OptionalPeerDiagnosis): string {
|
|
134
|
+
const missing = [
|
|
135
|
+
...diagnosis.missingFromPackageJson,
|
|
136
|
+
...diagnosis.notInstalled.filter((n) => !diagnosis.missingFromPackageJson.includes(n)),
|
|
137
|
+
];
|
|
138
|
+
const unique = [...new Set(missing)];
|
|
139
|
+
if (unique.length === 0) return 'pnpm install';
|
|
140
|
+
return `pnpm add ${unique.map((n) => `${n}@${PEER_VERSION}`).join(' ')}`;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export function getOptionalPeerDependencies(config: Record<string, unknown>): Record<string, string> {
|
|
144
|
+
const peers = diagnoseOptionalPeers(process.cwd(), config);
|
|
145
|
+
const deps: Record<string, string> = {};
|
|
146
|
+
if (peers.speech?.required) deps[SPEECH_PACKAGE] = PEER_VERSION;
|
|
147
|
+
if (peers.htmlRenderer?.required) deps[HTML_RENDERER_PACKAGE] = PEER_VERSION;
|
|
148
|
+
return deps;
|
|
149
|
+
}
|
package/src/project-deps.ts
CHANGED
|
@@ -4,22 +4,22 @@ import path from 'node:path';
|
|
|
4
4
|
import type { AISetupConfig } from './ai.js';
|
|
5
5
|
import type { InitOptions } from './types.js';
|
|
6
6
|
|
|
7
|
-
/**
|
|
8
|
-
export const MCP_SDK_VERSION = '
|
|
7
|
+
/** 新项目依赖默认接受 npm latest 漂移,避免脚手架维护固定版本表。 */
|
|
8
|
+
export const MCP_SDK_VERSION = 'latest';
|
|
9
9
|
|
|
10
|
-
const AI_STACK_VERSION = '
|
|
11
|
-
const ZOD_VERSION = '
|
|
12
|
-
const VERCEL_AI_VERSION = '
|
|
10
|
+
const AI_STACK_VERSION = 'latest';
|
|
11
|
+
const ZOD_VERSION = 'latest';
|
|
12
|
+
const VERCEL_AI_VERSION = 'latest';
|
|
13
13
|
|
|
14
14
|
const PROVIDER_SDK_PACKAGES: Record<string, { pkg: string; version: string }> = {
|
|
15
|
-
openai: { pkg: '@ai-sdk/openai', version: '
|
|
16
|
-
anthropic: { pkg: '@ai-sdk/anthropic', version: '
|
|
17
|
-
google: { pkg: '@ai-sdk/google', version: '
|
|
18
|
-
gemini: { pkg: '@ai-sdk/google', version: '
|
|
19
|
-
deepseek: { pkg: '@ai-sdk/deepseek', version: '
|
|
20
|
-
ollama: { pkg: '@ai-sdk/openai-compatible', version: '
|
|
21
|
-
moonshot: { pkg: '@ai-sdk/openai-compatible', version: '
|
|
22
|
-
zhipu: { pkg: '@ai-sdk/openai-compatible', version: '
|
|
15
|
+
openai: { pkg: '@ai-sdk/openai', version: 'latest' },
|
|
16
|
+
anthropic: { pkg: '@ai-sdk/anthropic', version: 'latest' },
|
|
17
|
+
google: { pkg: '@ai-sdk/google', version: 'latest' },
|
|
18
|
+
gemini: { pkg: '@ai-sdk/google', version: 'latest' },
|
|
19
|
+
deepseek: { pkg: '@ai-sdk/deepseek', version: 'latest' },
|
|
20
|
+
ollama: { pkg: '@ai-sdk/openai-compatible', version: 'latest' },
|
|
21
|
+
moonshot: { pkg: '@ai-sdk/openai-compatible', version: 'latest' },
|
|
22
|
+
zhipu: { pkg: '@ai-sdk/openai-compatible', version: 'latest' },
|
|
23
23
|
};
|
|
24
24
|
|
|
25
25
|
function providerSdkPackage(provider?: string): { pkg: string; version: string } | undefined {
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import type { PackageJsonLike } from './project-deps.js';
|
|
4
|
+
import {
|
|
5
|
+
diagnoseAIDependencies,
|
|
6
|
+
formatAIDependencyFixCommand,
|
|
7
|
+
getRequiredAIDependenciesForConfig,
|
|
8
|
+
isAiEnabledInConfig,
|
|
9
|
+
findMissingPackageDependencies,
|
|
10
|
+
findUnresolvedPackageInstalls,
|
|
11
|
+
} from './project-deps.js';
|
|
12
|
+
import { diagnoseOptionalPeers, formatOptionalPeerFixCommand, getOptionalPeerDependencies } from './optional-peers.js';
|
|
13
|
+
|
|
14
|
+
export interface UpgradeToL4Diagnosis {
|
|
15
|
+
ai: ReturnType<typeof diagnoseAIDependencies>;
|
|
16
|
+
optionalPeers: ReturnType<typeof diagnoseOptionalPeers>;
|
|
17
|
+
missingAiDeps: string[];
|
|
18
|
+
missingOptionalPeers: string[];
|
|
19
|
+
fixCommand: string;
|
|
20
|
+
configSnippets: string[];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const L4_CONFIG_SNIPPETS = [
|
|
24
|
+
'# --- L4 可选多模态(取消注释并安装 optional peer)---',
|
|
25
|
+
'# ai:',
|
|
26
|
+
'# multimodal:',
|
|
27
|
+
'# audio:',
|
|
28
|
+
'# strategy: transcribe # 需 @zhin.js/speech',
|
|
29
|
+
'# speech:',
|
|
30
|
+
'# stt:',
|
|
31
|
+
'# provider: ollama',
|
|
32
|
+
'# model: whisper',
|
|
33
|
+
'# tts:',
|
|
34
|
+
'# provider: edge',
|
|
35
|
+
'# htmlRenderer:',
|
|
36
|
+
'# width: 540',
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
/** minimal-bot → full-bot / L4 升级诊断 */
|
|
40
|
+
export function diagnoseUpgradeToL4(
|
|
41
|
+
cwd: string,
|
|
42
|
+
config: Record<string, unknown>,
|
|
43
|
+
pkg?: PackageJsonLike,
|
|
44
|
+
): UpgradeToL4Diagnosis {
|
|
45
|
+
const packageJsonPath = path.join(cwd, 'package.json');
|
|
46
|
+
const packageJson = pkg ?? (fs.existsSync(packageJsonPath)
|
|
47
|
+
? fs.readJsonSync(packageJsonPath) as PackageJsonLike
|
|
48
|
+
: {});
|
|
49
|
+
|
|
50
|
+
const aiEnabled = isAiEnabledInConfig(config);
|
|
51
|
+
const ai = aiEnabled ? diagnoseAIDependencies(cwd, config, packageJson) : null;
|
|
52
|
+
const optionalPeers = diagnoseOptionalPeers(cwd, config, packageJson);
|
|
53
|
+
|
|
54
|
+
const missingAiDeps = ai
|
|
55
|
+
? [...new Set([...ai.missingFromPackageJson, ...ai.notInstalled])]
|
|
56
|
+
: [...Object.keys(getRequiredAIDependenciesForConfig({ ai: { enabled: true } }))];
|
|
57
|
+
|
|
58
|
+
if (!aiEnabled) {
|
|
59
|
+
const required = getRequiredAIDependenciesForConfig({ ai: { enabled: true } });
|
|
60
|
+
const fromPkg = findMissingPackageDependencies(packageJson, required);
|
|
61
|
+
const declared = Object.keys(required).filter((n) => !fromPkg.includes(n));
|
|
62
|
+
const notInstalled = findUnresolvedPackageInstalls(cwd, declared);
|
|
63
|
+
missingAiDeps.push(...fromPkg, ...notInstalled);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const missingOptionalPeers: string[] = [];
|
|
67
|
+
for (const peer of [optionalPeers.speech, optionalPeers.htmlRenderer]) {
|
|
68
|
+
if (!peer?.required) continue;
|
|
69
|
+
missingOptionalPeers.push(
|
|
70
|
+
...peer.missingFromPackageJson,
|
|
71
|
+
...peer.notInstalled.filter((n) => !peer.missingFromPackageJson.includes(n)),
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const fixParts: string[] = [];
|
|
76
|
+
if (!aiEnabled || missingAiDeps.length > 0) {
|
|
77
|
+
const required = ai?.required ?? getRequiredAIDependenciesForConfig({ ai: { enabled: true } });
|
|
78
|
+
fixParts.push(formatAIDependencyFixCommand(
|
|
79
|
+
[...new Set(missingAiDeps)],
|
|
80
|
+
required,
|
|
81
|
+
));
|
|
82
|
+
}
|
|
83
|
+
for (const peer of [optionalPeers.speech, optionalPeers.htmlRenderer]) {
|
|
84
|
+
if (peer && (peer.missingFromPackageJson.length > 0 || peer.notInstalled.length > 0)) {
|
|
85
|
+
fixParts.push(formatOptionalPeerFixCommand(peer));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return {
|
|
90
|
+
ai,
|
|
91
|
+
optionalPeers,
|
|
92
|
+
missingAiDeps: [...new Set(missingAiDeps)],
|
|
93
|
+
missingOptionalPeers: [...new Set(missingOptionalPeers)],
|
|
94
|
+
fixCommand: fixParts.join(' && '),
|
|
95
|
+
configSnippets: L4_CONFIG_SNIPPETS,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function getUpgradeToL4Dependencies(config: Record<string, unknown>): Record<string, string> {
|
|
100
|
+
const deps = getRequiredAIDependenciesForConfig({ ai: { enabled: true } });
|
|
101
|
+
return { ...deps, ...getOptionalPeerDependencies(config) };
|
|
102
|
+
}
|