@zhin.js/scaffold-wizard 0.1.4 → 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/README.md CHANGED
@@ -19,7 +19,7 @@ Zhin 项目脚手架的**共享交互向导**库。适配器、AI、数据库的
19
19
  | `adapter.ts` / `adapter-configurers.ts` | 适配器选择与分步配置(Telegram polling/webhook、GitHub App、OneBot11 等) |
20
20
  | `ai.ts` | AI Provider、触发方式、会话与安全默认值 |
21
21
  | `database.ts` | 数据库类型与连接参数 |
22
- | `project-deps.ts` | 依赖收集(含启用 AI 时预装 `@modelcontextprotocol/sdk`)、SQLite 前置条件 |
22
+ | `project-deps.ts` | 依赖收集(启用 AI 时写入 `@zhin.js/agent`、`zod`、`ai`、所选 `@ai-sdk/*`、`@modelcontextprotocol/sdk`)、SQLite 前置条件 |
23
23
  | `apply.ts` | 将向导结果写入 `zhin.config.*`、`.env`、`package.json` |
24
24
  | `types.ts` | `InitOptions` 等共享类型 |
25
25
 
package/lib/ai.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpG,QAAQ,CAAC,EAAE;QAAE,WAAW,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9G,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;QAC5C,UAAU,EAAE,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,QAAQ,CAAC;QAC9D,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,OAAO,CAAC,EAAE;QACR,WAAW,EAAE,OAAO,CAAC;QACrB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,OAAO,GAAG,iBAAiB,GAAG,KAAK,CAAC;QAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;CACJ;AAqED,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;uBAeX,MAAM,EAAE;;;;;;;CAOhC,CAAC;AAEF;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,aAAa,CAAC,CA2L1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAa/D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAwFlE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAuDlE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA4BlE"}
1
+ {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpG,QAAQ,CAAC,EAAE;QAAE,WAAW,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9G,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;QAC5C,UAAU,EAAE,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,QAAQ,CAAC;QAC9D,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,OAAO,CAAC,EAAE;QACR,WAAW,EAAE,OAAO,CAAC;QACrB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,OAAO,GAAG,iBAAiB,GAAG,KAAK,CAAC;QAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;CACJ;AAwED,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;uBAeX,MAAM,EAAE;;;;;;;CAOhC,CAAC;AAEF;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,aAAa,CAAC,CA2L1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAa/D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAwFlE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAuDlE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA4BlE"}
package/lib/ai.js CHANGED
@@ -45,19 +45,22 @@ const PROVIDERS = [
45
45
  keyPlaceholder: '',
46
46
  },
47
47
  ];
48
- function providerApiFor(name) {
48
+ function providerSdkFor(name) {
49
49
  switch (name) {
50
50
  case 'anthropic':
51
- return 'anthropic-messages';
51
+ return 'anthropic';
52
52
  case 'google':
53
53
  case 'gemini':
54
- return 'google-generative-ai';
54
+ return 'google';
55
55
  case 'ollama':
56
- return 'ollama-chat';
57
- case 'cloudflare':
58
- return 'cloudflare-workers-ai';
56
+ return 'ollama';
57
+ case 'deepseek':
58
+ return 'deepseek';
59
+ case 'moonshot':
60
+ case 'zhipu':
61
+ return 'openai-compatible';
59
62
  default:
60
- return 'openai-completions';
63
+ return 'openai';
61
64
  }
62
65
  }
63
66
  function defaultModelForProvider(driver) {
@@ -93,7 +96,7 @@ export const RECOMMENDED_AI_DEFAULTS = {
93
96
  export async function configureAI() {
94
97
  console.log('');
95
98
  console.log(chalk.blue('🤖 配置 AI 智能体'));
96
- console.log(chalk.gray(' 启用后将预装 @modelcontextprotocol/sdk,支持 MCP 与 memory 扩展。'));
99
+ console.log(chalk.gray(' 启用后将自动写入 package.json:@zhin.js/agent、zod、ai、所选 @ai-sdk/*、@modelcontextprotocol/sdk。'));
97
100
  console.log(chalk.gray(' 会话持久化默认开启,将自动配置 SQLite 数据库(若尚未选择)。'));
98
101
  const { enableAI } = await inquirer.prompt([
99
102
  {
@@ -297,7 +300,7 @@ export function generateAIConfigYaml(config) {
297
300
  if (config.providers) {
298
301
  for (const [name, providerConfig] of Object.entries(config.providers)) {
299
302
  lines.push(` ${name}:`);
300
- lines.push(` api: ${providerApiFor(name)}`);
303
+ lines.push(` sdk: ${providerSdkFor(name)}`);
301
304
  if (providerConfig.apiKey) {
302
305
  lines.push(` apiKey: ${providerConfig.apiKey}`);
303
306
  }
package/lib/ai.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ai.js","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai.js","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -6,6 +6,10 @@ export { ADAPTERS_DOCS_URL, ADAPTERS_INDEX_URL, ADAPTERS_ESSENTIALS_URL, adapter
6
6
  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
- export { MCP_SDK_VERSION, getAIDependencies, ensureDatabaseForAI, ensureDatabaseForAdapters, } from './project-deps.js';
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
@@ -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,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
@@ -3,6 +3,8 @@ export { configureAdapters, generateAdapterEnvVars, generateEndpointsConfigYaml,
3
3
  export { ADAPTERS_DOCS_URL, ADAPTERS_INDEX_URL, ADAPTERS_ESSENTIALS_URL, adapterDocsUrl, } from './adapter-configurers.js';
4
4
  export { configureAI, generateAIEnvVars, generateAIConfigYaml, generateAIConfigJSON, generateAIConfigToml, RECOMMENDED_AI_DEFAULTS, } from './ai.js';
5
5
  export { configureDatabaseOptions } from './database.js';
6
- export { MCP_SDK_VERSION, getAIDependencies, ensureDatabaseForAI, ensureDatabaseForAdapters, } from './project-deps.js';
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,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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"}
@@ -1,9 +1,44 @@
1
1
  import type { AISetupConfig } from './ai.js';
2
2
  import type { InitOptions } from './types.js';
3
- /** 与 monorepo 中 agent / test-bot 对齐的 MCP SDK 版本 */
4
- export declare const MCP_SDK_VERSION = "^1.29.0";
3
+ /** 新项目依赖默认接受 npm latest 漂移,避免脚手架维护固定版本表。 */
4
+ export declare const MCP_SDK_VERSION = "latest";
5
+ /** 启用 AI 时将写入 package.json 的依赖名(用于向导提示与 CLI 输出) */
6
+ export declare function listAIDependencyNames(provider?: string, options?: {
7
+ includeMcp?: boolean;
8
+ }): string[];
9
+ export declare function formatAIDependencyHint(provider?: string, options?: {
10
+ includeMcp?: boolean;
11
+ }): string;
12
+ export interface PackageJsonLike {
13
+ dependencies?: Record<string, string>;
14
+ devDependencies?: Record<string, string>;
15
+ }
16
+ /** zhin.config 中是否启用了 AI(enabled 未显式 false 且存在 agents/providers) */
17
+ export declare function isAiEnabledInConfig(config: {
18
+ ai?: unknown;
19
+ }): boolean;
20
+ export declare function resolveDefaultProviderFromConfig(config: {
21
+ ai?: unknown;
22
+ }): string | undefined;
23
+ /** 根据 zhin.config 的 ai 段推导应安装的 production 依赖 */
24
+ export declare function getRequiredAIDependenciesForConfig(config: {
25
+ ai?: unknown;
26
+ }): Record<string, string>;
27
+ export declare function findMissingPackageDependencies(pkg: PackageJsonLike, required: Record<string, string>): string[];
28
+ export declare function findUnresolvedPackageInstalls(cwd: string, packageNames: string[]): string[];
29
+ export interface AIDependencyDiagnosis {
30
+ enabled: true;
31
+ provider?: string;
32
+ required: Record<string, string>;
33
+ missingFromPackageJson: string[];
34
+ notInstalled: string[];
35
+ }
36
+ export declare function diagnoseAIDependencies(cwd: string, config: {
37
+ ai?: unknown;
38
+ }, pkg?: PackageJsonLike): AIDependencyDiagnosis | null;
39
+ export declare function formatAIDependencyFixCommand(missing: string[], required: Record<string, string>): string;
5
40
  /**
6
- * AI 启用时预装 MCP SDK,避免 memoryMcp / mcpServers 运行时报 optional peer 缺失。
41
+ * AI 启用时安装 agent 栈 + 所选 provider 的 @ai-sdk/* + 可选 MCP SDK。
7
42
  */
8
43
  export declare function getAIDependencies(ai?: AISetupConfig): Record<string, string>;
9
44
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"project-deps.d.ts","sourceRoot":"","sources":["../src/project-deps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,mDAAmD;AACnD,eAAO,MAAM,eAAe,YAAY,CAAC;AAEzC;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAK5E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAa9D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAUpE"}
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"}
@@ -1,14 +1,170 @@
1
- /** 与 monorepo 中 agent / test-bot 对齐的 MCP SDK 版本 */
2
- export const MCP_SDK_VERSION = '^1.29.0';
1
+ import { createRequire } from 'node:module';
2
+ import fs from 'fs-extra';
3
+ import path from 'node:path';
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
+ const PROVIDER_SDK_PACKAGES = {
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
+ };
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 启用时预装 MCP SDK,避免 memoryMcp / mcpServers 运行时报 optional peer 缺失。
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
- return {
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 一致)。
@@ -1 +1 @@
1
- {"version":3,"file":"project-deps.js","sourceRoot":"","sources":["../src/project-deps.ts"],"names":[],"mappings":"AAGA,mDAAmD;AACnD,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAC;AAEzC;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAkB;IAClD,IAAI,CAAC,EAAE,EAAE,OAAO;QAAE,OAAO,EAAE,CAAC;IAC5B,OAAO;QACL,2BAA2B,EAAE,eAAe;KAC7C,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAoB;IACtD,IAAI,OAAO,CAAC,GAAG;QAAE,OAAO;IACxB,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO;QAAE,OAAO;IACjC,IAAI,OAAO,CAAC,QAAQ;QAAE,OAAO;IAE7B,MAAM,WAAW,GAAG,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,KAAK,CAAC;IAC/D,IAAI,CAAC,WAAW;QAAE,OAAO;IAEzB,OAAO,CAAC,QAAQ,GAAG;QACjB,OAAO,EAAE,QAAQ;QACjB,QAAQ,EAAE,eAAe;QACzB,IAAI,EAAE,KAAK;KACZ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAoB;IAC5D,IAAI,OAAO,CAAC,GAAG;QAAE,OAAO;IACxB,IAAI,OAAO,CAAC,QAAQ;QAAE,OAAO;IAC7B,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,gBAAgB;QAAE,OAAO;IAEhD,OAAO,CAAC,QAAQ,GAAG;QACjB,OAAO,EAAE,QAAQ;QACjB,QAAQ,EAAE,eAAe;QACzB,IAAI,EAAE,KAAK;KACZ,CAAC;AACJ,CAAC"}
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;
@@ -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":"AAwBA,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"}
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"}
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhin.js/scaffold-wizard",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
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",
@@ -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",
package/src/ai.ts CHANGED
@@ -76,19 +76,22 @@ const PROVIDERS = [
76
76
  },
77
77
  ] as const;
78
78
 
79
- function providerApiFor(name: string): string {
79
+ function providerSdkFor(name: string): string {
80
80
  switch (name) {
81
81
  case 'anthropic':
82
- return 'anthropic-messages';
82
+ return 'anthropic';
83
83
  case 'google':
84
84
  case 'gemini':
85
- return 'google-generative-ai';
85
+ return 'google';
86
86
  case 'ollama':
87
- return 'ollama-chat';
88
- case 'cloudflare':
89
- return 'cloudflare-workers-ai';
87
+ return 'ollama';
88
+ case 'deepseek':
89
+ return 'deepseek';
90
+ case 'moonshot':
91
+ case 'zhipu':
92
+ return 'openai-compatible';
90
93
  default:
91
- return 'openai-completions';
94
+ return 'openai';
92
95
  }
93
96
  }
94
97
 
@@ -127,7 +130,7 @@ export const RECOMMENDED_AI_DEFAULTS = {
127
130
  export async function configureAI(): Promise<AISetupConfig> {
128
131
  console.log('');
129
132
  console.log(chalk.blue('🤖 配置 AI 智能体'));
130
- console.log(chalk.gray(' 启用后将预装 @modelcontextprotocol/sdk,支持 MCP 与 memory 扩展。'));
133
+ console.log(chalk.gray(' 启用后将自动写入 package.json:@zhin.js/agent、zod、ai、所选 @ai-sdk/*、@modelcontextprotocol/sdk。'));
131
134
  console.log(chalk.gray(' 会话持久化默认开启,将自动配置 SQLite 数据库(若尚未选择)。'));
132
135
 
133
136
  const { enableAI } = await inquirer.prompt([
@@ -348,7 +351,7 @@ export function generateAIConfigYaml(config: AISetupConfig): string {
348
351
  if (config.providers) {
349
352
  for (const [name, providerConfig] of Object.entries(config.providers)) {
350
353
  lines.push(` ${name}:`);
351
- lines.push(` api: ${providerApiFor(name)}`);
354
+ lines.push(` sdk: ${providerSdkFor(name)}`);
352
355
  if (providerConfig.apiKey) {
353
356
  lines.push(` apiKey: ${providerConfig.apiKey}`);
354
357
  }
package/src/index.ts CHANGED
@@ -34,10 +34,33 @@ export { configureDatabaseOptions } from './database.js';
34
34
  export {
35
35
  MCP_SDK_VERSION,
36
36
  getAIDependencies,
37
+ listAIDependencyNames,
38
+ formatAIDependencyHint,
39
+ isAiEnabledInConfig,
40
+ resolveDefaultProviderFromConfig,
41
+ getRequiredAIDependenciesForConfig,
42
+ diagnoseAIDependencies,
43
+ formatAIDependencyFixCommand,
37
44
  ensureDatabaseForAI,
38
45
  ensureDatabaseForAdapters,
39
46
  } from './project-deps.js';
40
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
+
41
64
  export {
42
65
  CONSOLE_HOST_PLUGINS,
43
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
+ }
@@ -1,17 +1,194 @@
1
+ import { createRequire } from 'node:module';
2
+ import fs from 'fs-extra';
3
+ import path from 'node:path';
1
4
  import type { AISetupConfig } from './ai.js';
2
5
  import type { InitOptions } from './types.js';
3
6
 
4
- /** 与 monorepo 中 agent / test-bot 对齐的 MCP SDK 版本 */
5
- export const MCP_SDK_VERSION = '^1.29.0';
7
+ /** 新项目依赖默认接受 npm latest 漂移,避免脚手架维护固定版本表。 */
8
+ export const MCP_SDK_VERSION = 'latest';
9
+
10
+ const AI_STACK_VERSION = 'latest';
11
+ const ZOD_VERSION = 'latest';
12
+ const VERCEL_AI_VERSION = 'latest';
13
+
14
+ const PROVIDER_SDK_PACKAGES: Record<string, { pkg: string; version: string }> = {
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
+ };
24
+
25
+ function providerSdkPackage(provider?: string): { pkg: string; version: string } | undefined {
26
+ if (!provider) return undefined;
27
+ return PROVIDER_SDK_PACKAGES[provider];
28
+ }
29
+
30
+ /** 启用 AI 时将写入 package.json 的依赖名(用于向导提示与 CLI 输出) */
31
+ export function listAIDependencyNames(provider?: string, options?: { includeMcp?: boolean }): string[] {
32
+ const names = ['@zhin.js/agent', 'zod', 'ai'];
33
+ if (options?.includeMcp !== false) {
34
+ names.push('@modelcontextprotocol/sdk');
35
+ }
36
+ const sdk = providerSdkPackage(provider);
37
+ if (sdk && !names.includes(sdk.pkg)) {
38
+ names.push(sdk.pkg);
39
+ }
40
+ return names;
41
+ }
42
+
43
+ export function formatAIDependencyHint(provider?: string, options?: { includeMcp?: boolean }): string {
44
+ return listAIDependencyNames(provider, options).join(', ');
45
+ }
46
+
47
+ export interface PackageJsonLike {
48
+ dependencies?: Record<string, string>;
49
+ devDependencies?: Record<string, string>;
50
+ }
51
+
52
+ /** zhin.config 中是否启用了 AI(enabled 未显式 false 且存在 agents/providers) */
53
+ export function isAiEnabledInConfig(config: { ai?: unknown }): boolean {
54
+ const ai = config.ai;
55
+ if (!ai || typeof ai !== 'object' || Array.isArray(ai)) return false;
56
+ const rec = ai as Record<string, unknown>;
57
+ if (rec.enabled === false) return false;
58
+ if (rec.enabled === true) return true;
59
+ const agents = rec.agents;
60
+ if (agents && typeof agents === 'object' && !Array.isArray(agents) && Object.keys(agents).length > 0) {
61
+ return true;
62
+ }
63
+ const providers = rec.providers;
64
+ if (providers && typeof providers === 'object' && !Array.isArray(providers) && Object.keys(providers).length > 0) {
65
+ return true;
66
+ }
67
+ return false;
68
+ }
69
+
70
+ export function resolveDefaultProviderFromConfig(config: { ai?: unknown }): string | undefined {
71
+ const ai = config.ai;
72
+ if (!ai || typeof ai !== 'object' || Array.isArray(ai)) return undefined;
73
+ const rec = ai as Record<string, unknown>;
74
+ const agents = rec.agents;
75
+ if (agents && typeof agents === 'object' && !Array.isArray(agents)) {
76
+ const zhin = (agents as Record<string, { provider?: string }>).zhin;
77
+ if (zhin?.provider) return String(zhin.provider);
78
+ const firstAgent = Object.values(agents as Record<string, { provider?: string }>)[0];
79
+ if (firstAgent?.provider) return String(firstAgent.provider);
80
+ }
81
+ const providers = rec.providers;
82
+ if (providers && typeof providers === 'object' && !Array.isArray(providers)) {
83
+ const first = Object.keys(providers as Record<string, unknown>)[0];
84
+ if (first) return first;
85
+ }
86
+ if (rec.defaultProvider != null) return String(rec.defaultProvider);
87
+ return undefined;
88
+ }
89
+
90
+ function aiConfigNeedsMcp(ai: Record<string, unknown>): boolean {
91
+ if (ai.memoryMcp === true) return true;
92
+ const servers = ai.mcpServers;
93
+ return Array.isArray(servers) && servers.length > 0;
94
+ }
95
+
96
+ /** 根据 zhin.config 的 ai 段推导应安装的 production 依赖 */
97
+ export function getRequiredAIDependenciesForConfig(config: { ai?: unknown }): Record<string, string> {
98
+ if (!isAiEnabledInConfig(config)) return {};
99
+ const ai = config.ai as Record<string, unknown>;
100
+ const setup: AISetupConfig = {
101
+ enabled: true,
102
+ defaultProvider: resolveDefaultProviderFromConfig(config),
103
+ memoryMcp: aiConfigNeedsMcp(ai),
104
+ };
105
+ const deps = getAIDependencies(setup);
106
+ if (!aiConfigNeedsMcp(ai)) {
107
+ delete deps['@modelcontextprotocol/sdk'];
108
+ }
109
+ return deps;
110
+ }
111
+
112
+ export function findMissingPackageDependencies(
113
+ pkg: PackageJsonLike,
114
+ required: Record<string, string>,
115
+ ): string[] {
116
+ const declared = new Set([
117
+ ...Object.keys(pkg.dependencies ?? {}),
118
+ ...Object.keys(pkg.devDependencies ?? {}),
119
+ ]);
120
+ return Object.keys(required).filter((name) => !declared.has(name));
121
+ }
122
+
123
+ export function findUnresolvedPackageInstalls(cwd: string, packageNames: string[]): string[] {
124
+ const pkgJson = path.join(cwd, 'package.json');
125
+ if (!fs.existsSync(pkgJson)) return [...packageNames];
126
+ const req = createRequire(pkgJson);
127
+ const missing: string[] = [];
128
+ for (const name of packageNames) {
129
+ try {
130
+ req.resolve(`${name}/package.json`);
131
+ } catch {
132
+ missing.push(name);
133
+ }
134
+ }
135
+ return missing;
136
+ }
137
+
138
+ export interface AIDependencyDiagnosis {
139
+ enabled: true;
140
+ provider?: string;
141
+ required: Record<string, string>;
142
+ missingFromPackageJson: string[];
143
+ notInstalled: string[];
144
+ }
145
+
146
+ export function diagnoseAIDependencies(
147
+ cwd: string,
148
+ config: { ai?: unknown },
149
+ pkg?: PackageJsonLike,
150
+ ): AIDependencyDiagnosis | null {
151
+ if (!isAiEnabledInConfig(config)) return null;
152
+ const required = getRequiredAIDependenciesForConfig(config);
153
+ const packageJsonPath = path.join(cwd, 'package.json');
154
+ const packageJson = pkg ?? (fs.existsSync(packageJsonPath) ? fs.readJsonSync(packageJsonPath) as PackageJsonLike : {});
155
+ const missingFromPackageJson = findMissingPackageDependencies(packageJson, required);
156
+ const declared = Object.keys(required).filter((name) => !missingFromPackageJson.includes(name));
157
+ const notInstalled = findUnresolvedPackageInstalls(cwd, declared);
158
+ return {
159
+ enabled: true,
160
+ provider: resolveDefaultProviderFromConfig(config),
161
+ required,
162
+ missingFromPackageJson,
163
+ notInstalled,
164
+ };
165
+ }
166
+
167
+ export function formatAIDependencyFixCommand(missing: string[], required: Record<string, string>): string {
168
+ if (missing.length === 0) return 'pnpm install';
169
+ const specs = missing.map((name) => `${name}@${required[name] ?? 'latest'}`);
170
+ return `pnpm add ${specs.join(' ')}`;
171
+ }
6
172
 
7
173
  /**
8
- * AI 启用时预装 MCP SDK,避免 memoryMcp / mcpServers 运行时报 optional peer 缺失。
174
+ * AI 启用时安装 agent 栈 + 所选 provider 的 @ai-sdk/* + 可选 MCP SDK。
9
175
  */
10
176
  export function getAIDependencies(ai?: AISetupConfig): Record<string, string> {
11
177
  if (!ai?.enabled) return {};
12
- return {
178
+
179
+ const deps: Record<string, string> = {
180
+ '@zhin.js/agent': AI_STACK_VERSION,
181
+ zod: ZOD_VERSION,
182
+ ai: VERCEL_AI_VERSION,
13
183
  '@modelcontextprotocol/sdk': MCP_SDK_VERSION,
14
184
  };
185
+
186
+ const sdk = providerSdkPackage(ai.defaultProvider);
187
+ if (sdk) {
188
+ deps[sdk.pkg] = sdk.version;
189
+ }
190
+
191
+ return deps;
15
192
  }
16
193
 
17
194
  /**
package/src/types.ts CHANGED
@@ -6,6 +6,7 @@ export type { AdapterSetupResult } from './adapter.js';
6
6
 
7
7
  export interface InitOptions {
8
8
  name?: string;
9
+ template?: 'default' | 'life-assistant';
9
10
  config?: 'json' | 'yaml' | 'toml';
10
11
  runtime?: 'node' | 'bun';
11
12
  yes?: boolean;
@@ -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
+ }