@bundy-lmw/hive-server 1.0.1

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.
Files changed (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +211 -0
  3. package/dist/bootstrap.d.ts +36 -0
  4. package/dist/bootstrap.d.ts.map +1 -0
  5. package/dist/bootstrap.js +86 -0
  6. package/dist/bootstrap.js.map +1 -0
  7. package/dist/cli/index.d.ts +8 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +125 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/config.d.ts +93 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +156 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/gateway/auth.d.ts +16 -0
  16. package/dist/gateway/auth.d.ts.map +1 -0
  17. package/dist/gateway/auth.js +50 -0
  18. package/dist/gateway/auth.js.map +1 -0
  19. package/dist/gateway/http.d.ts +9 -0
  20. package/dist/gateway/http.d.ts.map +1 -0
  21. package/dist/gateway/http.js +178 -0
  22. package/dist/gateway/http.js.map +1 -0
  23. package/dist/gateway/websocket.d.ts +18 -0
  24. package/dist/gateway/websocket.d.ts.map +1 -0
  25. package/dist/gateway/websocket.js +197 -0
  26. package/dist/gateway/websocket.js.map +1 -0
  27. package/dist/gateway/ws/admin-handler.d.ts +68 -0
  28. package/dist/gateway/ws/admin-handler.d.ts.map +1 -0
  29. package/dist/gateway/ws/admin-handler.js +573 -0
  30. package/dist/gateway/ws/admin-handler.js.map +1 -0
  31. package/dist/gateway/ws/data-types.d.ts +130 -0
  32. package/dist/gateway/ws/data-types.d.ts.map +1 -0
  33. package/dist/gateway/ws/data-types.js +7 -0
  34. package/dist/gateway/ws/data-types.js.map +1 -0
  35. package/dist/gateway/ws/log-buffer.d.ts +29 -0
  36. package/dist/gateway/ws/log-buffer.d.ts.map +1 -0
  37. package/dist/gateway/ws/log-buffer.js +58 -0
  38. package/dist/gateway/ws/log-buffer.js.map +1 -0
  39. package/dist/gateway/ws/types.d.ts +67 -0
  40. package/dist/gateway/ws/types.d.ts.map +1 -0
  41. package/dist/gateway/ws/types.js +68 -0
  42. package/dist/gateway/ws/types.js.map +1 -0
  43. package/dist/heartbeat-scheduler.d.ts +43 -0
  44. package/dist/heartbeat-scheduler.d.ts.map +1 -0
  45. package/dist/heartbeat-scheduler.js +118 -0
  46. package/dist/heartbeat-scheduler.js.map +1 -0
  47. package/dist/main.d.ts +23 -0
  48. package/dist/main.d.ts.map +1 -0
  49. package/dist/main.js +120 -0
  50. package/dist/main.js.map +1 -0
  51. package/dist/plugin-manager/cli.d.ts +6 -0
  52. package/dist/plugin-manager/cli.d.ts.map +1 -0
  53. package/dist/plugin-manager/cli.js +115 -0
  54. package/dist/plugin-manager/cli.js.map +1 -0
  55. package/dist/plugin-manager/constants.d.ts +24 -0
  56. package/dist/plugin-manager/constants.d.ts.map +1 -0
  57. package/dist/plugin-manager/constants.js +58 -0
  58. package/dist/plugin-manager/constants.js.map +1 -0
  59. package/dist/plugin-manager/index.d.ts +11 -0
  60. package/dist/plugin-manager/index.d.ts.map +1 -0
  61. package/dist/plugin-manager/index.js +10 -0
  62. package/dist/plugin-manager/index.js.map +1 -0
  63. package/dist/plugin-manager/installer.d.ts +19 -0
  64. package/dist/plugin-manager/installer.d.ts.map +1 -0
  65. package/dist/plugin-manager/installer.js +256 -0
  66. package/dist/plugin-manager/installer.js.map +1 -0
  67. package/dist/plugin-manager/manager.d.ts +39 -0
  68. package/dist/plugin-manager/manager.d.ts.map +1 -0
  69. package/dist/plugin-manager/manager.js +171 -0
  70. package/dist/plugin-manager/manager.js.map +1 -0
  71. package/dist/plugin-manager/registry.d.ts +31 -0
  72. package/dist/plugin-manager/registry.d.ts.map +1 -0
  73. package/dist/plugin-manager/registry.js +63 -0
  74. package/dist/plugin-manager/registry.js.map +1 -0
  75. package/dist/plugin-manager/searcher.d.ts +18 -0
  76. package/dist/plugin-manager/searcher.d.ts.map +1 -0
  77. package/dist/plugin-manager/searcher.js +50 -0
  78. package/dist/plugin-manager/searcher.js.map +1 -0
  79. package/dist/plugin-manager/types.d.ts +71 -0
  80. package/dist/plugin-manager/types.d.ts.map +1 -0
  81. package/dist/plugin-manager/types.js +5 -0
  82. package/dist/plugin-manager/types.js.map +1 -0
  83. package/dist/plugins.d.ts +18 -0
  84. package/dist/plugins.d.ts.map +1 -0
  85. package/dist/plugins.js +198 -0
  86. package/dist/plugins.js.map +1 -0
  87. package/package.json +54 -0
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Plugin Searcher — npm Registry Search API
3
+ */
4
+ const NPM_SEARCH_URL = 'https://registry.npmjs.org/-/v1/search';
5
+ /**
6
+ * 搜索 npm 上的 hive plugin 插件
7
+ */
8
+ export async function searchPlugins(keyword, size = 20) {
9
+ const text = keyword
10
+ ? `${keyword} keywords:hive-plugin`
11
+ : 'keywords:hive-plugin';
12
+ const url = `${NPM_SEARCH_URL}?text=${encodeURIComponent(text)}&size=${size}`;
13
+ try {
14
+ const res = await fetch(url);
15
+ if (!res.ok) {
16
+ throw new Error(`npm Registry returned ${res.status}`);
17
+ }
18
+ const data = (await res.json());
19
+ const packages = data.objects.map(obj => obj.package);
20
+ return { packages, total: data.total };
21
+ }
22
+ catch (error) {
23
+ if (error instanceof TypeError && error.message.includes('fetch')) {
24
+ throw new Error('Network error: failed to reach npm Registry. Check your internet connection.');
25
+ }
26
+ throw error;
27
+ }
28
+ }
29
+ /**
30
+ * 格式化搜索结果为终端表格
31
+ */
32
+ export function formatSearchResults(packages, total) {
33
+ if (packages.length === 0) {
34
+ return 'No plugins found.\n\nUse `hive plugin search <keyword>` to discover plugins.';
35
+ }
36
+ const lines = [];
37
+ lines.push('');
38
+ for (const pkg of packages) {
39
+ const name = pkg.name.padEnd(35);
40
+ const version = `v${pkg.version}`.padEnd(12);
41
+ const desc = (pkg.description || '').slice(0, 50);
42
+ lines.push(` ${name} ${version} ${desc}`);
43
+ }
44
+ lines.push('');
45
+ lines.push(` Showing ${packages.length} of ${total} plugin(s).`);
46
+ lines.push(' Install: hive plugin add <package-name>');
47
+ lines.push('');
48
+ return lines.join('\n');
49
+ }
50
+ //# sourceMappingURL=searcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searcher.js","sourceRoot":"","sources":["../../src/plugin-manager/searcher.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,cAAc,GAAG,wCAAwC,CAAA;AAO/D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAgB,EAAE,IAAI,GAAG,EAAE;IAC7D,MAAM,IAAI,GAAG,OAAO;QAClB,CAAC,CAAC,GAAG,OAAO,uBAAuB;QACnC,CAAC,CAAC,sBAAsB,CAAA;IAE1B,MAAM,GAAG,GAAG,GAAG,cAAc,SAAS,kBAAkB,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAA;IAE7E,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA;QAC5B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;QACxD,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAsB,CAAA;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACrD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAA;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAClE,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAA;QACjG,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAA4B,EAAE,KAAa;IAC7E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,8EAA8E,CAAA;IACvF,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAChC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC5C,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACjD,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC,CAAA;IAC5C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,MAAM,OAAO,KAAK,aAAa,CAAC,CAAA;IACjE,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAA;IACvD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Plugin Distribution Types
3
+ */
4
+ /** 安装来源类型 */
5
+ export type SourceType = 'npm' | 'git' | 'local';
6
+ /** 安装来源 */
7
+ export interface PluginSource {
8
+ /** 来源类型 */
9
+ type: SourceType;
10
+ /** 原始输入 */
11
+ raw: string;
12
+ /** 解析后的包名 / URL / 路径 */
13
+ resolved: string;
14
+ /** 安装目标目录名 */
15
+ targetName: string;
16
+ }
17
+ /** 注册表中的插件记录 */
18
+ export interface RegistryEntry {
19
+ /** 来源(如 npm:@bundy-lmw/hive-plugin-feishu@1.0.0) */
20
+ source: string;
21
+ /** 安装时间 ISO string */
22
+ installedAt: string;
23
+ /** 解析出的版本 */
24
+ resolvedVersion: string;
25
+ }
26
+ /** 注册表结构 */
27
+ export type PluginRegistry = Record<string, RegistryEntry>;
28
+ /** npm Registry 搜索结果中的包信息 */
29
+ export interface NpmSearchPackage {
30
+ name: string;
31
+ version: string;
32
+ description?: string;
33
+ links?: {
34
+ npm?: string;
35
+ homepage?: string;
36
+ repository?: string;
37
+ };
38
+ }
39
+ /** npm Registry 搜索 API 响应 */
40
+ export interface NpmSearchResponse {
41
+ objects: Array<{
42
+ package: NpmSearchPackage;
43
+ score: {
44
+ final: number;
45
+ detail: {
46
+ popularity: number;
47
+ quality: number;
48
+ maintenance: number;
49
+ };
50
+ };
51
+ }>;
52
+ total: number;
53
+ }
54
+ /** 安装结果 */
55
+ export interface InstallResult {
56
+ success: boolean;
57
+ name: string;
58
+ version?: string;
59
+ error?: string;
60
+ }
61
+ /** 插件详情(info 命令输出) */
62
+ export interface PluginInfo {
63
+ name: string;
64
+ version: string;
65
+ source: string;
66
+ installedAt: string;
67
+ description?: string;
68
+ homepage?: string;
69
+ config?: Record<string, unknown>;
70
+ }
71
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/plugin-manager/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,aAAa;AACb,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAA;AAEhD,WAAW;AACX,MAAM,WAAW,YAAY;IAC3B,WAAW;IACX,IAAI,EAAE,UAAU,CAAA;IAChB,WAAW;IACX,GAAG,EAAE,MAAM,CAAA;IACX,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc;IACd,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,gBAAgB;AAChB,MAAM,WAAW,aAAa;IAC5B,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAA;IACd,sBAAsB;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa;IACb,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,YAAY;AACZ,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;AAE1D,6BAA6B;AAC7B,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE;QACN,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;CACF;AAED,6BAA6B;AAC7B,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,KAAK,CAAC;QACb,OAAO,EAAE,gBAAgB,CAAA;QACzB,KAAK,EAAE;YACL,KAAK,EAAE,MAAM,CAAA;YACb,MAAM,EAAE;gBACN,UAAU,EAAE,MAAM,CAAA;gBAClB,OAAO,EAAE,MAAM,CAAA;gBACf,WAAW,EAAE,MAAM,CAAA;aACpB,CAAA;SACF,CAAA;KACF,CAAC,CAAA;IACF,KAAK,EAAE,MAAM,CAAA;CACd;AAED,WAAW;AACX,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,sBAAsB;AACtB,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Plugin Distribution Types
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/plugin-manager/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 插件动态加载
3
+ *
4
+ * 支持两种来源:
5
+ * 1. 目录扫描:.hive/plugins/ 下的插件包(优先)
6
+ * 2. npm 动态 import:hive.config.json 中的 plugins 配置(兜底)
7
+ *
8
+ * 配置统一从 hive.config.json 的 plugins 字段读取,
9
+ * 插件目录下的 config.json 仅作为配置模板。
10
+ */
11
+ import type { IPlugin } from '@bundy-lmw/hive-core';
12
+ /**
13
+ * 加载所有插件(目录扫描优先 + npm 兜底)
14
+ *
15
+ * 配置统一从 hive.config.json 的 plugins 字段读取。
16
+ */
17
+ export declare function loadPlugins(): Promise<IPlugin[]>;
18
+ //# sourceMappingURL=plugins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AA0MnD;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAkBtD"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * 插件动态加载
3
+ *
4
+ * 支持两种来源:
5
+ * 1. 目录扫描:.hive/plugins/ 下的插件包(优先)
6
+ * 2. npm 动态 import:hive.config.json 中的 plugins 配置(兜底)
7
+ *
8
+ * 配置统一从 hive.config.json 的 plugins 字段读取,
9
+ * 插件目录下的 config.json 仅作为配置模板。
10
+ */
11
+ import { existsSync, readdirSync, readFileSync } from 'fs';
12
+ import { resolve } from 'path';
13
+ import { pathToFileURL } from 'url';
14
+ import { getConfig } from './config.js';
15
+ import { PLUGINS_DIR } from './plugin-manager/constants.js';
16
+ // ============================================
17
+ // 目录扫描
18
+ // ============================================
19
+ /**
20
+ * 扫描 .hive/plugins/ 目录,发现合法插件
21
+ *
22
+ * 支持两种目录结构:
23
+ * 1. 直接目录:plugin/package.json(含 hive.plugin)
24
+ * 2. npm --prefix 安装:plugin/node_modules/@bundy-lmw/hive-plugin-xxx/package.json
25
+ */
26
+ function scanPluginDir() {
27
+ if (!existsSync(PLUGINS_DIR)) {
28
+ return [];
29
+ }
30
+ const manifests = [];
31
+ const entries = readdirSync(PLUGINS_DIR, { withFileTypes: true });
32
+ for (const entry of entries) {
33
+ if (!entry.isDirectory() || entry.name.startsWith('.'))
34
+ continue;
35
+ const pluginDir = resolve(PLUGINS_DIR, entry.name);
36
+ const manifest = resolveManifest(pluginDir, entry.name);
37
+ if (manifest) {
38
+ manifests.push(manifest);
39
+ }
40
+ }
41
+ return manifests;
42
+ }
43
+ /**
44
+ * 从插件目录解析 manifest
45
+ *
46
+ * 优先检查直接 package.json,其次检查 npm --prefix 安装的 node_modules。
47
+ */
48
+ function resolveManifest(pluginDir, dirName) {
49
+ // 1. 直接目录下的 package.json
50
+ const directPkgPath = resolve(pluginDir, 'package.json');
51
+ if (existsSync(directPkgPath)) {
52
+ try {
53
+ const pkgJson = JSON.parse(readFileSync(directPkgPath, 'utf-8'));
54
+ if (pkgJson.hive?.plugin) {
55
+ const entryFile = pkgJson.hive.entry ?? 'dist/index.js';
56
+ return {
57
+ dir: pluginDir,
58
+ name: pkgJson.name ?? dirName,
59
+ entry: resolve(pluginDir, entryFile),
60
+ };
61
+ }
62
+ }
63
+ catch (error) {
64
+ console.error(`[plugins] Failed to parse ${dirName}/package.json:`, error instanceof Error ? error.message : 'unknown error');
65
+ return null;
66
+ }
67
+ }
68
+ // 2. npm --prefix 安装:检查 node_modules/ 下的包
69
+ const nmDir = resolve(pluginDir, 'node_modules');
70
+ if (!existsSync(nmDir))
71
+ return null;
72
+ const nmEntries = readdirSync(nmDir, { withFileTypes: true });
73
+ for (const nmEntry of nmEntries) {
74
+ if (!nmEntry.isDirectory())
75
+ continue;
76
+ let pkgJsonPath;
77
+ if (nmEntry.name.startsWith('@')) {
78
+ // @scope/pkg 形式
79
+ const scopeDir = resolve(nmDir, nmEntry.name);
80
+ const scopeEntries = readdirSync(scopeDir, { withFileTypes: true });
81
+ for (const scopeEntry of scopeEntries) {
82
+ if (!scopeEntry.isDirectory())
83
+ continue;
84
+ pkgJsonPath = resolve(scopeDir, scopeEntry.name, 'package.json');
85
+ if (existsSync(pkgJsonPath)) {
86
+ const manifest = tryParsePkgJson(pkgJsonPath, pluginDir, dirName);
87
+ if (manifest)
88
+ return manifest;
89
+ }
90
+ }
91
+ }
92
+ else {
93
+ pkgJsonPath = resolve(nmDir, nmEntry.name, 'package.json');
94
+ if (existsSync(pkgJsonPath)) {
95
+ const manifest = tryParsePkgJson(pkgJsonPath, pluginDir, dirName);
96
+ if (manifest)
97
+ return manifest;
98
+ }
99
+ }
100
+ }
101
+ return null;
102
+ }
103
+ function tryParsePkgJson(pkgJsonPath, pluginDir, dirName) {
104
+ try {
105
+ const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));
106
+ if (!pkgJson.hive?.plugin)
107
+ return null;
108
+ const entryFile = pkgJson.hive.entry ?? 'dist/index.js';
109
+ const pkgDir = resolve(pkgJsonPath, '..');
110
+ return {
111
+ dir: pluginDir,
112
+ name: pkgJson.name ?? dirName,
113
+ entry: resolve(pkgDir, entryFile),
114
+ };
115
+ }
116
+ catch (error) {
117
+ console.warn(`[plugins] Failed to parse ${pkgJsonPath}:`, error instanceof Error ? error.message : 'unknown error');
118
+ return null;
119
+ }
120
+ }
121
+ // ============================================
122
+ // 加载逻辑
123
+ // ============================================
124
+ /**
125
+ * 从目录扫描结果加载插件
126
+ *
127
+ * 配置从 hive.config.json 读取,按插件 name 匹配。
128
+ */
129
+ async function loadFromDirectory(manifests, pluginConfigs) {
130
+ const plugins = [];
131
+ for (const manifest of manifests) {
132
+ try {
133
+ const entryUrl = pathToFileURL(manifest.entry).href;
134
+ const mod = await import(entryUrl);
135
+ const PluginClass = mod.default;
136
+ if (typeof PluginClass !== 'function') {
137
+ console.error(`[plugins] ${manifest.name}: default export is not a constructor`);
138
+ continue;
139
+ }
140
+ const config = pluginConfigs[manifest.name] ?? {};
141
+ const plugin = new PluginClass(config);
142
+ plugins.push(plugin);
143
+ console.log(`[plugins] Loaded (dir): ${manifest.name}`);
144
+ }
145
+ catch (error) {
146
+ console.error(`[plugins] Failed to load ${manifest.name}:`, error instanceof Error ? error.message : error);
147
+ }
148
+ }
149
+ return plugins;
150
+ }
151
+ /**
152
+ * 从 npm 包名动态加载插件
153
+ */
154
+ async function loadFromNpm(pluginConfigs) {
155
+ const plugins = [];
156
+ for (const [packageName, config] of Object.entries(pluginConfigs)) {
157
+ try {
158
+ const mod = await import(packageName);
159
+ const PluginClass = mod.default;
160
+ if (typeof PluginClass !== 'function') {
161
+ console.error(`[plugins] ${packageName}: default export is not a constructor`);
162
+ continue;
163
+ }
164
+ const plugin = new PluginClass(config);
165
+ plugins.push(plugin);
166
+ console.log(`[plugins] Loaded (npm): ${packageName}`);
167
+ }
168
+ catch (error) {
169
+ console.error(`[plugins] Failed to load ${packageName}:`, error instanceof Error ? error.message : error);
170
+ }
171
+ }
172
+ return plugins;
173
+ }
174
+ // ============================================
175
+ // 入口
176
+ // ============================================
177
+ /**
178
+ * 加载所有插件(目录扫描优先 + npm 兜底)
179
+ *
180
+ * 配置统一从 hive.config.json 的 plugins 字段读取。
181
+ */
182
+ export async function loadPlugins() {
183
+ const { pluginConfigs } = getConfig();
184
+ // 1. 目录扫描(配置从 hive.config.json 读取)
185
+ const manifests = scanPluginDir();
186
+ const dirPlugins = await loadFromDirectory(manifests, pluginConfigs);
187
+ // 2. npm 动态 import(跳过已被目录加载的同名插件)
188
+ const dirNames = new Set(manifests.map(m => m.name));
189
+ const npmConfigs = {};
190
+ for (const [name, config] of Object.entries(pluginConfigs)) {
191
+ if (!dirNames.has(name)) {
192
+ npmConfigs[name] = config;
193
+ }
194
+ }
195
+ const npmPlugins = await loadFromNpm(npmConfigs);
196
+ return [...dirPlugins, ...npmPlugins];
197
+ }
198
+ //# sourceMappingURL=plugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@bundy-lmw/hive-server",
3
+ "version": "1.0.1",
4
+ "type": "module",
5
+ "main": "./dist/main.js",
6
+ "types": "./dist/main.d.ts",
7
+ "bin": {
8
+ "hive": "./dist/cli/index.js"
9
+ },
10
+ "exports": {
11
+ ".": {
12
+ "import": "./dist/main.js",
13
+ "types": "./dist/main.d.ts"
14
+ }
15
+ },
16
+ "scripts": {
17
+ "build": "tsc -p tsconfig.build.json",
18
+ "dev": "tsc -p tsconfig.build.json --watch",
19
+ "start": "node dist/main.js",
20
+ "cli": "node dist/cli/index.js",
21
+ "test": "vitest run",
22
+ "test:watch": "vitest"
23
+ },
24
+ "dependencies": {
25
+ "@bundy-lmw/hive-core": "workspace:*",
26
+ "commander": "^14.0.3",
27
+ "dotenv": "^16.4.0",
28
+ "hono": "^4.12.0",
29
+ "ws": "^8.20.0",
30
+ "zod": "^3.23.0"
31
+ },
32
+ "devDependencies": {
33
+ "@types/node": "^20.11.0",
34
+ "@types/ws": "^8.18.1",
35
+ "ajv": "^8.18.0",
36
+ "typescript": "^5.3.0",
37
+ "vitest": "^4.1.0"
38
+ },
39
+ "files": [
40
+ "dist",
41
+ "README.md",
42
+ "LICENSE"
43
+ ],
44
+ "repository": {
45
+ "type": "git",
46
+ "url": "https://github.com/1695365384/hive.git",
47
+ "directory": "apps/server"
48
+ },
49
+ "homepage": "https://github.com/1695365384/hive#readme",
50
+ "license": "MIT",
51
+ "engines": {
52
+ "node": ">=18.0.0"
53
+ }
54
+ }