@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
package/dist/main.js ADDED
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Hive Server Main Entry
3
+ *
4
+ * Unified entry point for both CLI and HTTP/WebSocket server.
5
+ */
6
+ import { getConfig } from './config.js';
7
+ import { bootstrap, shutdown } from './bootstrap.js';
8
+ /**
9
+ * Start Hive server with all gateways
10
+ */
11
+ export async function startServer(options = {}) {
12
+ const cfg = getConfig();
13
+ const serverConfig = {
14
+ ...cfg,
15
+ port: options.port || cfg.port,
16
+ plugins: options.plugins || cfg.plugins,
17
+ };
18
+ console.log('[hive] Bootstrapping...');
19
+ const context = await bootstrap({ config: serverConfig });
20
+ console.log('[hive] Bootstrap complete');
21
+ // Create HTTP server
22
+ const { createServer } = await import('http');
23
+ const { createHttpGateway } = await import('./gateway/http.js');
24
+ const app = createHttpGateway(context);
25
+ const server = createServer(async (req, res) => {
26
+ try {
27
+ const url = `http://${req.headers.host || 'localhost'}${req.url}`;
28
+ const headers = new Headers();
29
+ for (const [key, value] of Object.entries(req.headers)) {
30
+ if (value) {
31
+ headers.set(key, Array.isArray(value) ? value.join(', ') : String(value));
32
+ }
33
+ }
34
+ let body;
35
+ if (req.method !== 'GET' && req.method !== 'HEAD') {
36
+ const chunks = [];
37
+ for await (const chunk of req) {
38
+ chunks.push(chunk);
39
+ }
40
+ body = Buffer.concat(chunks).toString();
41
+ }
42
+ const request = new Request(url, {
43
+ method: req.method,
44
+ headers,
45
+ body,
46
+ });
47
+ const response = await app.fetch(request);
48
+ res.statusCode = response.status;
49
+ response.headers.forEach((value, key) => {
50
+ res.setHeader(key, value);
51
+ });
52
+ const buffer = await response.arrayBuffer();
53
+ res.end(Buffer.from(buffer));
54
+ }
55
+ catch (err) {
56
+ console.error('[hive] Request error:', err);
57
+ res.statusCode = 500;
58
+ res.end('Internal Server Error');
59
+ }
60
+ });
61
+ // Setup WebSocket (plugin channels)
62
+ const { createWebSocketGateway } = await import('./gateway/websocket.js');
63
+ const wsGateway = createWebSocketGateway(server, context);
64
+ // Setup Admin WebSocket
65
+ const { WebSocketServer } = await import('ws');
66
+ const { createAdminWsHandler } = await import('./gateway/ws/admin-handler.js');
67
+ const adminWs = new WebSocketServer({ noServer: true });
68
+ const adminHandler = createAdminWsHandler();
69
+ adminHandler.setServer(context.server);
70
+ adminHandler.setHttpServer(server);
71
+ server.on('upgrade', (request, socket, head) => {
72
+ const url = new URL(request.url || '/', `http://${request.headers.host}`);
73
+ if (url.pathname === '/ws/admin') {
74
+ adminWs.handleUpgrade(request, socket, head, (ws) => {
75
+ adminWs.emit('connection', ws, request);
76
+ });
77
+ }
78
+ // 其他 WS 升级(如插件 channel)由 wsGateway 处理
79
+ });
80
+ adminWs.on('connection', (ws) => {
81
+ adminHandler.handleConnection(ws);
82
+ });
83
+ return new Promise((resolve) => {
84
+ server.listen(serverConfig.port, () => {
85
+ console.log(`[hive] Server started on port ${serverConfig.port}`);
86
+ console.log(`[hive] Admin WS available at ws://localhost:${serverConfig.port}/ws/admin`);
87
+ resolve({
88
+ context,
89
+ close: async () => {
90
+ adminHandler.closeAll();
91
+ adminWs.close();
92
+ wsGateway.close();
93
+ server.close();
94
+ await shutdown(context);
95
+ },
96
+ });
97
+ });
98
+ });
99
+ }
100
+ /**
101
+ * Run CLI mode
102
+ */
103
+ export async function runCli(args) {
104
+ // Import and run CLI
105
+ const cli = await import('./cli/index.js');
106
+ process.argv = [process.argv[0], process.argv[1], ...args];
107
+ await cli.main();
108
+ }
109
+ // Auto-start if run directly
110
+ const isDirectRun = process.argv[1] &&
111
+ (import.meta.url === `file://${process.argv[1]}` ||
112
+ import.meta.url === new URL(process.argv[1], `file://${process.cwd()}/`).href);
113
+ if (isDirectRun) {
114
+ startServer().catch((error) => {
115
+ console.error('[hive] Failed to start:', error);
116
+ process.exit(1);
117
+ });
118
+ }
119
+ export { bootstrap, shutdown };
120
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Plugin CLI — hive plugin 子命令
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare function createPluginCommand(): Command;
6
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/plugin-manager/cli.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC,wBAAgB,mBAAmB,IAAI,OAAO,CA4G7C"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Plugin CLI — hive plugin 子命令
3
+ */
4
+ import { Command } from 'commander';
5
+ import { searchPlugins, formatSearchResults } from './searcher.js';
6
+ import { installPlugin } from './installer.js';
7
+ import { listPlugins, removePlugin, showPluginInfo, updatePlugin } from './manager.js';
8
+ export function createPluginCommand() {
9
+ const plugin = new Command('plugin')
10
+ .description('Manage Hive plugins');
11
+ // hive plugin search [keyword]
12
+ plugin
13
+ .command('search')
14
+ .description('Search for plugins on npm')
15
+ .argument('[keyword]', 'search keyword')
16
+ .action(async (keyword) => {
17
+ try {
18
+ const { packages, total } = await searchPlugins(keyword);
19
+ console.log(formatSearchResults(packages, total));
20
+ }
21
+ catch (error) {
22
+ console.error(` Error: ${error instanceof Error ? error.message : String(error)}`);
23
+ process.exitCode = 1;
24
+ }
25
+ });
26
+ // hive plugin add <source>
27
+ plugin
28
+ .command('add')
29
+ .description('Install a plugin (npm package, git URL, or local path)')
30
+ .argument('<source>', 'package name, git URL, or local path')
31
+ .action(async (source) => {
32
+ try {
33
+ const result = await installPlugin(source);
34
+ if (result.success) {
35
+ console.log(` ✓ Installed ${result.name}${result.version ? ` v${result.version}` : ''}`);
36
+ console.log(' Restart Hive to activate the plugin.');
37
+ }
38
+ else {
39
+ console.error(` ✗ ${result.error}`);
40
+ process.exitCode = 1;
41
+ }
42
+ }
43
+ catch (error) {
44
+ console.error(` Error: ${error instanceof Error ? error.message : String(error)}`);
45
+ process.exitCode = 1;
46
+ }
47
+ });
48
+ // hive plugin list
49
+ plugin
50
+ .command('list')
51
+ .description('List installed plugins')
52
+ .action(() => {
53
+ console.log(listPlugins());
54
+ });
55
+ // hive plugin remove <name>
56
+ plugin
57
+ .command('remove')
58
+ .description('Uninstall a plugin')
59
+ .argument('<name>', 'plugin name')
60
+ .action((name) => {
61
+ const result = removePlugin(name);
62
+ if (result.success) {
63
+ console.log(` ✓ Removed ${name}`);
64
+ console.log(' Restart Hive to apply changes.');
65
+ }
66
+ else {
67
+ console.error(` ✗ ${result.error}`);
68
+ process.exitCode = 1;
69
+ }
70
+ });
71
+ // hive plugin info <name>
72
+ plugin
73
+ .command('info')
74
+ .description('Show plugin details')
75
+ .argument('<name>', 'plugin name')
76
+ .action((name) => {
77
+ const result = showPluginInfo(name);
78
+ if (result.success) {
79
+ console.log(` Name: ${result.info.name}`);
80
+ console.log(` Version: ${result.info.version}`);
81
+ console.log(` Source: ${result.info.source}`);
82
+ console.log(` Installed: ${result.info.installedAt}`);
83
+ if (result.info.description)
84
+ console.log(` Desc: ${result.info.description}`);
85
+ if (result.info.homepage)
86
+ console.log(` Homepage: ${result.info.homepage}`);
87
+ }
88
+ else {
89
+ console.error(` ✗ ${result.error}`);
90
+ process.exitCode = 1;
91
+ }
92
+ });
93
+ // hive plugin update [name]
94
+ plugin
95
+ .command('update')
96
+ .description('Update plugin(s) to latest version')
97
+ .argument('[name]', 'plugin name (omit to update all)')
98
+ .action(async (name) => {
99
+ const { updated, skipped, errors } = await updatePlugin(name);
100
+ for (const n of updated) {
101
+ console.log(` ✓ Updated ${n}`);
102
+ }
103
+ for (const n of skipped) {
104
+ console.log(` → ${n}: already up to date`);
105
+ }
106
+ for (const e of errors) {
107
+ console.error(` ✗ ${e.name}: ${e.error}`);
108
+ }
109
+ if (updated.length > 0) {
110
+ console.log(' Restart Hive to apply changes.');
111
+ }
112
+ });
113
+ return plugin;
114
+ }
115
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/plugin-manager/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Plugin Manager - Shared Constants & Utilities
3
+ */
4
+ /** Path separator (re-exported for consumers) */
5
+ export declare const sep: "/" | "\\";
6
+ /** .hive/plugins/ 目录 */
7
+ export declare const PLUGINS_DIR: string;
8
+ /** .hive/plugins/.registry.json */
9
+ export declare const REGISTRY_PATH: string;
10
+ /** hive.config.json */
11
+ export declare const CONFIG_PATH: string;
12
+ /**
13
+ * 验证目标路径是否在 plugins 目录内(防止路径穿越)
14
+ */
15
+ export declare function isPathSafe(targetName: string): boolean;
16
+ /**
17
+ * 验证 Git URL 是否在可信域名白名单内
18
+ */
19
+ export declare function isGitUrlTrusted(url: string): boolean;
20
+ /**
21
+ * 原子写入 JSON 文件:先写临时文件,再 rename
22
+ */
23
+ export declare function atomicWriteJSON(filePath: string, data: unknown): void;
24
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/plugin-manager/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,iDAAiD;AACjD,eAAO,MAAM,GAAG,YAAU,CAAA;AAG1B,wBAAwB;AACxB,eAAO,MAAM,WAAW,QAAgC,CAAA;AAExD,mCAAmC;AACnC,eAAO,MAAM,aAAa,QAAyC,CAAA;AAEnE,uBAAuB;AACvB,eAAO,MAAM,WAAW,QAAyC,CAAA;AAWjE;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAMtD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAWrE"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Plugin Manager - Shared Constants & Utilities
3
+ */
4
+ import { existsSync, mkdirSync, writeFileSync, renameSync } from 'fs';
5
+ import { resolve, dirname, sep as pathSep } from 'path';
6
+ /** Path separator (re-exported for consumers) */
7
+ export const sep = pathSep;
8
+ import { HIVE_HOME } from '../config.js';
9
+ /** .hive/plugins/ 目录 */
10
+ export const PLUGINS_DIR = resolve(HIVE_HOME, 'plugins');
11
+ /** .hive/plugins/.registry.json */
12
+ export const REGISTRY_PATH = resolve(PLUGINS_DIR, '.registry.json');
13
+ /** hive.config.json */
14
+ export const CONFIG_PATH = resolve(HIVE_HOME, 'hive.config.json');
15
+ /** 可信的 Git 托管域名白名单 */
16
+ const TRUSTED_GIT_HOSTS = [
17
+ 'github.com',
18
+ 'gitlab.com',
19
+ 'bitbucket.org',
20
+ 'gitee.com',
21
+ 'code.aliyun.com',
22
+ ];
23
+ /**
24
+ * 验证目标路径是否在 plugins 目录内(防止路径穿越)
25
+ */
26
+ export function isPathSafe(targetName) {
27
+ if (!targetName || targetName.includes('/') || targetName.includes('\\') || targetName.includes('..')) {
28
+ return false;
29
+ }
30
+ const resolved = resolve(PLUGINS_DIR, targetName);
31
+ return resolved.startsWith(PLUGINS_DIR + pathSep) || resolved === PLUGINS_DIR;
32
+ }
33
+ /**
34
+ * 验证 Git URL 是否在可信域名白名单内
35
+ */
36
+ export function isGitUrlTrusted(url) {
37
+ try {
38
+ const hostname = new URL(url).hostname;
39
+ return TRUSTED_GIT_HOSTS.some(host => hostname === host || hostname.endsWith('.' + host));
40
+ }
41
+ catch {
42
+ return false;
43
+ }
44
+ }
45
+ /**
46
+ * 原子写入 JSON 文件:先写临时文件,再 rename
47
+ */
48
+ export function atomicWriteJSON(filePath, data) {
49
+ const dir = dirname(filePath);
50
+ if (!existsSync(dir)) {
51
+ mkdirSync(dir, { recursive: true });
52
+ }
53
+ const tmpPath = `${filePath}.${Date.now()}.tmp`;
54
+ const content = JSON.stringify(data, null, 2) + '\n';
55
+ writeFileSync(tmpPath, content, 'utf-8');
56
+ renameSync(tmpPath, filePath);
57
+ }
58
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/plugin-manager/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,OAAO,EAAE,MAAM,MAAM,CAAA;AAEvD,iDAAiD;AACjD,MAAM,CAAC,MAAM,GAAG,GAAG,OAAO,CAAA;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC,wBAAwB;AACxB,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;AAExD,mCAAmC;AACnC,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAA;AAEnE,uBAAuB;AACvB,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAA;AAEjE,sBAAsB;AACtB,MAAM,iBAAiB,GAAG;IACxB,YAAY;IACZ,YAAY;IACZ,eAAe;IACf,WAAW;IACX,iBAAiB;CAClB,CAAA;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,UAAkB;IAC3C,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtG,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;IACjD,OAAO,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,QAAQ,KAAK,WAAW,CAAA;AAC/E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAA;QACtC,OAAO,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAA;IAC3F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,IAAa;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACrC,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAA;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAA;IAEpD,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IACxC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;AAC/B,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Plugin Manager — 公开 API
3
+ */
4
+ export { searchPlugins, formatSearchResults } from './searcher.js';
5
+ export { installPlugin, resolveSource } from './installer.js';
6
+ export { listPlugins, removePlugin, showPluginInfo, updatePlugin } from './manager.js';
7
+ export { loadRegistry, saveRegistry, addPlugin, removePlugin as removeFromRegistry, getPlugin, hasPlugin } from './registry.js';
8
+ export { createPluginCommand } from './cli.js';
9
+ export { PLUGINS_DIR, CONFIG_PATH, REGISTRY_PATH, isPathSafe, isGitUrlTrusted, atomicWriteJSON } from './constants.js';
10
+ export type { PluginSource, InstallResult, RegistryEntry, PluginRegistry, PluginInfo, NpmSearchPackage } from './types.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugin-manager/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAClE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACtF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,IAAI,kBAAkB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC/H,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACtH,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Plugin Manager — 公开 API
3
+ */
4
+ export { searchPlugins, formatSearchResults } from './searcher.js';
5
+ export { installPlugin, resolveSource } from './installer.js';
6
+ export { listPlugins, removePlugin, showPluginInfo, updatePlugin } from './manager.js';
7
+ export { loadRegistry, saveRegistry, addPlugin, removePlugin as removeFromRegistry, getPlugin, hasPlugin } from './registry.js';
8
+ export { createPluginCommand } from './cli.js';
9
+ export { PLUGINS_DIR, CONFIG_PATH, REGISTRY_PATH, isPathSafe, isGitUrlTrusted, atomicWriteJSON } from './constants.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin-manager/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAClE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACtF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,IAAI,kBAAkB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC/H,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Plugin Installer — 多来源安装
3
+ *
4
+ * 安全措施:
5
+ * - 使用 execFileSync 替代 execSync 防止命令注入
6
+ * - 路径穿越检查(isPathSafe)
7
+ * - Git URL 域名白名单(isGitUrlTrusted)
8
+ * - 安装失败自动回滚
9
+ */
10
+ import type { PluginSource, InstallResult } from './types.js';
11
+ /**
12
+ * 自动识别来源类型
13
+ */
14
+ export declare function resolveSource(input: string): PluginSource;
15
+ /**
16
+ * 安装插件(统一入口)
17
+ */
18
+ export declare function installPlugin(input: string): Promise<InstallResult>;
19
+ //# sourceMappingURL=installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/plugin-manager/installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE7D;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAgBzD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAqCzE"}