@mediaproc/cli 0.8.4 → 1.0.0

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 (86) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +25 -13
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/add.d.ts +1 -1
  5. package/dist/commands/add.d.ts.map +1 -1
  6. package/dist/commands/add.js +56 -131
  7. package/dist/commands/add.js.map +1 -1
  8. package/dist/commands/help.js +1 -1
  9. package/dist/commands/help.js.map +1 -1
  10. package/dist/commands/history.js +1 -1
  11. package/dist/commands/history.js.map +1 -1
  12. package/dist/commands/list.d.ts +1 -1
  13. package/dist/commands/list.d.ts.map +1 -1
  14. package/dist/commands/list.js +3 -3
  15. package/dist/commands/list.js.map +1 -1
  16. package/dist/commands/plugins.d.ts +1 -1
  17. package/dist/commands/plugins.d.ts.map +1 -1
  18. package/dist/commands/plugins.js +1 -1
  19. package/dist/commands/plugins.js.map +1 -1
  20. package/dist/commands/remove.d.ts +1 -1
  21. package/dist/commands/remove.d.ts.map +1 -1
  22. package/dist/commands/remove.js +14 -47
  23. package/dist/commands/remove.js.map +1 -1
  24. package/dist/commands/update.d.ts +2 -1
  25. package/dist/commands/update.d.ts.map +1 -1
  26. package/dist/commands/update.js +121 -142
  27. package/dist/commands/update.js.map +1 -1
  28. package/dist/index.d.ts +1 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +1 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/types.d.ts +3 -0
  33. package/dist/types.d.ts.map +1 -1
  34. package/dist/utils/history-manager.d.ts.map +1 -0
  35. package/dist/{history-manager.js → utils/history-manager.js} +1 -1
  36. package/dist/utils/history-manager.js.map +1 -0
  37. package/dist/utils/index.d.ts +4 -0
  38. package/dist/utils/index.d.ts.map +1 -0
  39. package/dist/utils/index.js +7 -0
  40. package/dist/utils/index.js.map +1 -0
  41. package/dist/utils/package-manager.d.ts +37 -0
  42. package/dist/utils/package-manager.d.ts.map +1 -0
  43. package/dist/utils/package-manager.js +195 -0
  44. package/dist/utils/package-manager.js.map +1 -0
  45. package/dist/utils/plugin-helpers.d.ts +39 -0
  46. package/dist/utils/plugin-helpers.d.ts.map +1 -0
  47. package/dist/utils/plugin-helpers.js +156 -0
  48. package/dist/utils/plugin-helpers.js.map +1 -0
  49. package/dist/utils/plugins/api.d.ts +106 -0
  50. package/dist/utils/plugins/api.d.ts.map +1 -0
  51. package/dist/utils/plugins/api.js +20 -0
  52. package/dist/utils/plugins/api.js.map +1 -0
  53. package/dist/utils/plugins/index.d.ts +4 -0
  54. package/dist/utils/plugins/index.d.ts.map +1 -0
  55. package/dist/utils/plugins/index.js +7 -0
  56. package/dist/utils/plugins/index.js.map +1 -0
  57. package/dist/utils/plugins/manager.d.ts +88 -0
  58. package/dist/utils/plugins/manager.d.ts.map +1 -0
  59. package/dist/utils/plugins/manager.js +267 -0
  60. package/dist/utils/plugins/manager.js.map +1 -0
  61. package/dist/{plugin-registry.d.ts → utils/plugins/registry.d.ts} +22 -1
  62. package/dist/utils/plugins/registry.d.ts.map +1 -0
  63. package/dist/{plugin-registry.js → utils/plugins/registry.js} +105 -7
  64. package/dist/utils/plugins/registry.js.map +1 -0
  65. package/package.json +4 -18
  66. package/dist/commands/delete.d.ts +0 -7
  67. package/dist/commands/delete.d.ts.map +0 -1
  68. package/dist/commands/delete.js +0 -250
  69. package/dist/commands/delete.js.map +0 -1
  70. package/dist/commands/stats.d.ts +0 -3
  71. package/dist/commands/stats.d.ts.map +0 -1
  72. package/dist/commands/stats.js +0 -157
  73. package/dist/commands/stats.js.map +0 -1
  74. package/dist/history-manager.d.ts.map +0 -1
  75. package/dist/history-manager.js.map +0 -1
  76. package/dist/plugin-api.d.ts +0 -44
  77. package/dist/plugin-api.d.ts.map +0 -1
  78. package/dist/plugin-api.js +0 -2
  79. package/dist/plugin-api.js.map +0 -1
  80. package/dist/plugin-manager.d.ts +0 -42
  81. package/dist/plugin-manager.d.ts.map +0 -1
  82. package/dist/plugin-manager.js +0 -113
  83. package/dist/plugin-manager.js.map +0 -1
  84. package/dist/plugin-registry.d.ts.map +0 -1
  85. package/dist/plugin-registry.js.map +0 -1
  86. /package/dist/{history-manager.d.ts → utils/history-manager.d.ts} +0 -0
@@ -0,0 +1,88 @@
1
+ import { Command } from 'commander';
2
+ import type { MediaProcPlugin } from '../../types.js';
3
+ import { PluginType, PluginStatus, type PluginLoadResult } from './api.js';
4
+ /**
5
+ * Enhanced Plugin Manager with concurrent loading protection and better error handling
6
+ */
7
+ export declare class PluginManager {
8
+ private plugins;
9
+ private loadingPlugins;
10
+ private failedPlugins;
11
+ private readonly pluginPrefix;
12
+ private readonly officialPlugins;
13
+ /**
14
+ * Check if a plugin is official (@mediaproc/* package)
15
+ */
16
+ isOfficialPlugin(pluginName: string): boolean;
17
+ /**
18
+ * Get the plugin prefix
19
+ */
20
+ getPluginPrefix(): string;
21
+ /**
22
+ * Get plugin type
23
+ */
24
+ getPluginType(pluginName: string): PluginType;
25
+ /**
26
+ * Get plugin status
27
+ */
28
+ getPluginStatus(pluginName: string): PluginStatus;
29
+ /**
30
+ * Load a specific plugin and register its commands
31
+ */
32
+ loadPlugin(pluginName: string, program: Command, isBuiltIn?: boolean): Promise<boolean>;
33
+ /**
34
+ * Load multiple plugins concurrently (with error tolerance)
35
+ */
36
+ loadPlugins(pluginNames: string[], program: Command, options?: {
37
+ throwOnError?: boolean;
38
+ }): Promise<PluginLoadResult[]>;
39
+ /**
40
+ * Get list of loaded plugins (currently in memory)
41
+ */
42
+ getLoadedPlugins(): string[];
43
+ /**
44
+ * Get official plugins list
45
+ */
46
+ getOfficialPlugins(): string[];
47
+ /**
48
+ * Get plugin instance
49
+ */
50
+ getPlugin(pluginName: string): MediaProcPlugin | undefined;
51
+ /**
52
+ * Get all plugin instances
53
+ */
54
+ getAllPlugins(): Map<string, MediaProcPlugin>;
55
+ /**
56
+ * Get failed plugins with error messages
57
+ */
58
+ getFailedPlugins(): Map<string, string>;
59
+ /**
60
+ * Unload a plugin (remove from registry)
61
+ * Properly cleans up all references to prevent memory leaks
62
+ */
63
+ unloadPlugin(pluginName: string): boolean;
64
+ /**
65
+ * Reload a plugin (unload then load again)
66
+ * Useful after updating a plugin to refresh its code
67
+ */
68
+ reloadPlugin(pluginName: string, program: Command): Promise<boolean>;
69
+ /**
70
+ * Check if any plugins are currently loading
71
+ */
72
+ hasLoadingPlugins(): boolean;
73
+ /**
74
+ * Get count of loaded plugins
75
+ */
76
+ getLoadedCount(): number;
77
+ /**
78
+ * Clear all plugins (useful for testing)
79
+ */
80
+ clear(): void;
81
+ }
82
+ export declare const pluginManager: PluginManager;
83
+ /**
84
+ * Get the plugin name for a given command name.
85
+ * Checks loaded plugins for a command match, otherwise returns 'core'.
86
+ */
87
+ export declare function getPluginNameForCommand(commandName: string): string;
88
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/utils/plugins/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE3E;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiB;IAG9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAW9B;IAEF;;OAEG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAI7C;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU;IAU7C;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY;IAajD;;OAEG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAqD3F;;OAEG;IACG,WAAW,CACf,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAO,GACvC,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAyB9B;;OAEG;IACH,gBAAgB,IAAI,MAAM,EAAE;IAI5B;;OAEG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAI9B;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI1D;;OAEG;IACH,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC;IAI7C;;OAEG;IACH,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAIvC;;;OAGG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAwBzC;;;OAGG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAyB1E;;OAEG;IACH,iBAAiB,IAAI,OAAO;IAI5B;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,KAAK,IAAI,IAAI;CAKd;AAGD,eAAO,MAAM,aAAa,eAAsB,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAwBnE"}
@@ -0,0 +1,267 @@
1
+ import { PluginType, PluginStatus } from './api.js';
2
+ /**
3
+ * Enhanced Plugin Manager with concurrent loading protection and better error handling
4
+ */
5
+ export class PluginManager {
6
+ plugins = new Map();
7
+ loadingPlugins = new Set();
8
+ failedPlugins = new Map();
9
+ pluginPrefix = '@mediaproc/';
10
+ // Official plugins (recommended, but installed on-demand)
11
+ officialPlugins = [
12
+ '@mediaproc/image',
13
+ '@mediaproc/video',
14
+ '@mediaproc/audio',
15
+ '@mediaproc/document',
16
+ '@mediaproc/animation',
17
+ '@mediaproc/3d',
18
+ '@mediaproc/stream',
19
+ '@mediaproc/ai',
20
+ '@mediaproc/metadata',
21
+ '@mediaproc/pipeline',
22
+ ];
23
+ /**
24
+ * Check if a plugin is official (@mediaproc/* package)
25
+ */
26
+ isOfficialPlugin(pluginName) {
27
+ return this.officialPlugins.includes(pluginName) || pluginName.startsWith(this.pluginPrefix);
28
+ }
29
+ /**
30
+ * Get the plugin prefix
31
+ */
32
+ getPluginPrefix() {
33
+ return this.pluginPrefix;
34
+ }
35
+ /**
36
+ * Get plugin type
37
+ */
38
+ getPluginType(pluginName) {
39
+ if (pluginName.startsWith('@mediaproc/')) {
40
+ return PluginType.OFFICIAL;
41
+ }
42
+ if (pluginName.startsWith('mediaproc-')) {
43
+ return PluginType.COMMUNITY;
44
+ }
45
+ return PluginType.THIRD_PARTY;
46
+ }
47
+ /**
48
+ * Get plugin status
49
+ */
50
+ getPluginStatus(pluginName) {
51
+ if (this.plugins.has(pluginName)) {
52
+ return PluginStatus.LOADED;
53
+ }
54
+ if (this.loadingPlugins.has(pluginName)) {
55
+ return PluginStatus.LOADING;
56
+ }
57
+ if (this.failedPlugins.has(pluginName)) {
58
+ return PluginStatus.ERROR;
59
+ }
60
+ return PluginStatus.NOT_INSTALLED;
61
+ }
62
+ /**
63
+ * Load a specific plugin and register its commands
64
+ */
65
+ async loadPlugin(pluginName, program, isBuiltIn = false) {
66
+ // Skip if already loaded
67
+ if (this.plugins.has(pluginName)) {
68
+ return true;
69
+ }
70
+ // Prevent concurrent loading of same plugin
71
+ if (this.loadingPlugins.has(pluginName)) {
72
+ throw new Error(`Plugin ${pluginName} is already being loaded`);
73
+ }
74
+ // Clear any previous failure state
75
+ this.failedPlugins.delete(pluginName);
76
+ this.loadingPlugins.add(pluginName);
77
+ try {
78
+ // Dynamic import of the plugin
79
+ const plugin = await import(pluginName);
80
+ // Validate plugin structure
81
+ if (!plugin.name || !plugin.version) {
82
+ this.loadingPlugins.delete(pluginName);
83
+ const error = `Plugin ${pluginName} missing required exports (name, version)`;
84
+ this.failedPlugins.set(pluginName, error);
85
+ throw new Error(error);
86
+ }
87
+ if (typeof plugin.register !== 'function') {
88
+ this.loadingPlugins.delete(pluginName);
89
+ const error = `Plugin ${pluginName} does not export a register() function`;
90
+ this.failedPlugins.set(pluginName, error);
91
+ throw new Error(error);
92
+ }
93
+ // Register plugin commands with the CLI
94
+ await plugin.register(program);
95
+ // Store plugin instance
96
+ this.plugins.set(pluginName, {
97
+ ...plugin,
98
+ isBuiltIn
99
+ });
100
+ this.loadingPlugins.delete(pluginName);
101
+ return true;
102
+ }
103
+ catch (error) {
104
+ this.loadingPlugins.delete(pluginName);
105
+ const errorMessage = error instanceof Error ? error.message : String(error);
106
+ this.failedPlugins.set(pluginName, errorMessage);
107
+ throw new Error(`Failed to load plugin ${pluginName}: ${errorMessage}`);
108
+ }
109
+ }
110
+ /**
111
+ * Load multiple plugins concurrently (with error tolerance)
112
+ */
113
+ async loadPlugins(pluginNames, program, options = {}) {
114
+ const results = await Promise.allSettled(pluginNames.map(name => this.loadPlugin(name, program)));
115
+ return results.map((result, index) => {
116
+ const pluginName = pluginNames[index];
117
+ if (result.status === 'fulfilled' && result.value) {
118
+ return {
119
+ success: true,
120
+ plugin: this.plugins.get(pluginName)
121
+ };
122
+ }
123
+ else {
124
+ const error = result.status === 'rejected' ? result.reason?.message : 'Unknown error';
125
+ if (options.throwOnError) {
126
+ throw new Error(error);
127
+ }
128
+ return {
129
+ success: false,
130
+ error
131
+ };
132
+ }
133
+ });
134
+ }
135
+ /**
136
+ * Get list of loaded plugins (currently in memory)
137
+ */
138
+ getLoadedPlugins() {
139
+ return Array.from(this.plugins.keys());
140
+ }
141
+ /**
142
+ * Get official plugins list
143
+ */
144
+ getOfficialPlugins() {
145
+ return [...this.officialPlugins];
146
+ }
147
+ /**
148
+ * Get plugin instance
149
+ */
150
+ getPlugin(pluginName) {
151
+ return this.plugins.get(pluginName);
152
+ }
153
+ /**
154
+ * Get all plugin instances
155
+ */
156
+ getAllPlugins() {
157
+ return new Map(this.plugins);
158
+ }
159
+ /**
160
+ * Get failed plugins with error messages
161
+ */
162
+ getFailedPlugins() {
163
+ return new Map(this.failedPlugins);
164
+ }
165
+ /**
166
+ * Unload a plugin (remove from registry)
167
+ * Properly cleans up all references to prevent memory leaks
168
+ */
169
+ unloadPlugin(pluginName) {
170
+ if (this.plugins.has(pluginName)) {
171
+ // Get plugin instance for cleanup
172
+ const plugin = this.plugins.get(pluginName);
173
+ // Call cleanup if plugin provides it
174
+ if (plugin && typeof plugin.cleanup === 'function') {
175
+ try {
176
+ plugin.cleanup();
177
+ }
178
+ catch (error) {
179
+ console.warn(`Warning: Plugin ${pluginName} cleanup failed:`, error);
180
+ }
181
+ }
182
+ // Remove from all tracking structures
183
+ this.plugins.delete(pluginName);
184
+ this.failedPlugins.delete(pluginName);
185
+ this.loadingPlugins.delete(pluginName);
186
+ return true;
187
+ }
188
+ return false;
189
+ }
190
+ /**
191
+ * Reload a plugin (unload then load again)
192
+ * Useful after updating a plugin to refresh its code
193
+ */
194
+ async reloadPlugin(pluginName, program) {
195
+ // Unload first (this will clean up resources)
196
+ this.unloadPlugin(pluginName);
197
+ // Clear Node.js module cache to force fresh import
198
+ // This is important when reloading after an update
199
+ try {
200
+ // Try CommonJS cache clearing
201
+ if (typeof require !== 'undefined' && require.cache) {
202
+ const moduleId = require.resolve(pluginName);
203
+ if (moduleId && require.cache[moduleId]) {
204
+ delete require.cache[moduleId];
205
+ }
206
+ }
207
+ }
208
+ catch (error) {
209
+ // Module may be ES module or not in cache - continue anyway
210
+ }
211
+ // Add a small delay to ensure file system has released handles
212
+ await new Promise(resolve => setTimeout(resolve, 100));
213
+ // Load fresh version with cache-busting query parameter
214
+ return await this.loadPlugin(pluginName, program);
215
+ }
216
+ /**
217
+ * Check if any plugins are currently loading
218
+ */
219
+ hasLoadingPlugins() {
220
+ return this.loadingPlugins.size > 0;
221
+ }
222
+ /**
223
+ * Get count of loaded plugins
224
+ */
225
+ getLoadedCount() {
226
+ return this.plugins.size;
227
+ }
228
+ /**
229
+ * Clear all plugins (useful for testing)
230
+ */
231
+ clear() {
232
+ this.plugins.clear();
233
+ this.loadingPlugins.clear();
234
+ this.failedPlugins.clear();
235
+ }
236
+ }
237
+ // Export a singleton PluginManager instance
238
+ export const pluginManager = new PluginManager();
239
+ /**
240
+ * Get the plugin name for a given command name.
241
+ * Checks loaded plugins for a command match, otherwise returns 'core'.
242
+ */
243
+ export function getPluginNameForCommand(commandName) {
244
+ const allPlugins = pluginManager.getAllPlugins();
245
+ for (const [pluginName, plugin] of allPlugins.entries()) {
246
+ // If plugin has a 'commands' array property (non-standard, but some plugins may add it)
247
+ if (plugin && plugin.commands && Array.isArray(plugin.commands)) {
248
+ if (plugin.commands.includes(commandName)) {
249
+ return pluginName;
250
+ }
251
+ }
252
+ // If plugin has a 'getCommands' method (non-standard, but some plugins may add it)
253
+ if (plugin && typeof plugin.getCommands === 'function') {
254
+ try {
255
+ const cmds = plugin.getCommands();
256
+ if (Array.isArray(cmds) && cmds.includes(commandName)) {
257
+ return pluginName;
258
+ }
259
+ }
260
+ catch {
261
+ // Ignore errors from getCommands
262
+ }
263
+ }
264
+ }
265
+ return 'core';
266
+ }
267
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/utils/plugins/manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAyB,MAAM,UAAU,CAAC;AAE3E;;GAEG;AACH,MAAM,OAAO,aAAa;IAChB,OAAO,GAAiC,IAAI,GAAG,EAAE,CAAC;IAClD,cAAc,GAAgB,IAAI,GAAG,EAAE,CAAC;IACxC,aAAa,GAAwB,IAAI,GAAG,EAAE,CAAC;IACtC,YAAY,GAAG,aAAa,CAAC;IAE9C,0DAA0D;IACzC,eAAe,GAAG;QACjC,kBAAkB;QAClB,kBAAkB;QAClB,kBAAkB;QAClB,qBAAqB;QACrB,sBAAsB;QACtB,eAAe;QACf,mBAAmB;QACnB,eAAe;QACf,qBAAqB;QACrB,qBAAqB;KACtB,CAAC;IAEF;;OAEG;IACH,gBAAgB,CAAC,UAAkB;QACjC,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC/F,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,UAAkB;QAC9B,IAAI,UAAU,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACzC,OAAO,UAAU,CAAC,QAAQ,CAAC;QAC7B,CAAC;QACD,IAAI,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACxC,OAAO,UAAU,CAAC,SAAS,CAAC;QAC9B,CAAC;QACD,OAAO,UAAU,CAAC,WAAW,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,UAAkB;QAChC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,OAAO,YAAY,CAAC,MAAM,CAAC;QAC7B,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACxC,OAAO,YAAY,CAAC,OAAO,CAAC;QAC9B,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACvC,OAAO,YAAY,CAAC,KAAK,CAAC;QAC5B,CAAC;QACD,OAAO,YAAY,CAAC,aAAa,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,UAAkB,EAAE,OAAgB,EAAE,SAAS,GAAG,KAAK;QACtE,yBAAyB;QACzB,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,4CAA4C;QAC5C,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,UAAU,UAAU,0BAA0B,CAAC,CAAC;QAClE,CAAC;QAED,mCAAmC;QACnC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEpC,IAAI,CAAC;YACH,+BAA+B;YAC/B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAoB,CAAC;YAE3D,4BAA4B;YAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACvC,MAAM,KAAK,GAAG,UAAU,UAAU,2CAA2C,CAAC;gBAC9E,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;YAED,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;gBAC1C,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACvC,MAAM,KAAK,GAAG,UAAU,UAAU,wCAAwC,CAAC;gBAC3E,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;YAED,wCAAwC;YACxC,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAE/B,wBAAwB;YACxB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE;gBAC3B,GAAG,MAAM;gBACT,SAAS;aACV,CAAC,CAAC;YAEH,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACvC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACvC,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,yBAAyB,UAAU,KAAK,YAAY,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,WAAqB,EACrB,OAAgB,EAChB,UAAsC,EAAE;QAExC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CACxD,CAAC;QAEF,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACnC,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClD,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;iBACrC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;gBACtF,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;oBACzB,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;gBACzB,CAAC;gBACD,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK;iBACN,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,UAAkB;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,UAAkB;QAC7B,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,kCAAkC;YAClC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAE5C,qCAAqC;YACrC,IAAI,MAAM,IAAI,OAAQ,MAAc,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;gBAC5D,IAAI,CAAC;oBACF,MAAc,CAAC,OAAO,EAAE,CAAC;gBAC5B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,IAAI,CAAC,mBAAmB,UAAU,kBAAkB,EAAE,KAAK,CAAC,CAAC;gBACvE,CAAC;YACH,CAAC;YAED,sCAAsC;YACtC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAChC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACtC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAEvC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY,CAAC,UAAkB,EAAE,OAAgB;QACrD,8CAA8C;QAC9C,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAE9B,mDAAmD;QACnD,mDAAmD;QACnD,IAAI,CAAC;YACH,8BAA8B;YAC9B,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC7C,IAAI,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACxC,OAAO,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,4DAA4D;QAC9D,CAAC;QAED,+DAA+D;QAC/D,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAEvD,wDAAwD;QACxD,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACF;AAED,4CAA4C;AAC5C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;AAEjD;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,WAAmB;IACzD,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,EAAE,CAAC;IAEjD,KAAK,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;QACxD,wFAAwF;QACxF,IAAI,MAAM,IAAK,MAAc,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAE,MAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClF,IAAK,MAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACnD,OAAO,UAAU,CAAC;YACpB,CAAC;QACH,CAAC;QACD,mFAAmF;QACnF,IAAI,MAAM,IAAI,OAAQ,MAAc,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;YAChE,IAAI,CAAC;gBACH,MAAM,IAAI,GAAI,MAAc,CAAC,WAAW,EAAE,CAAC;gBAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;oBACtD,OAAO,UAAU,CAAC;gBACpB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,iCAAiC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -11,6 +11,8 @@ export interface PluginRegistryEntry {
11
11
  type: 'official' | 'community';
12
12
  dependencies?: string[];
13
13
  systemRequirements?: string[];
14
+ keywords?: string[];
15
+ documentation?: string;
14
16
  }
15
17
  export declare const PLUGIN_REGISTRY: Record<string, PluginRegistryEntry>;
16
18
  /**
@@ -19,18 +21,37 @@ export declare const PLUGIN_REGISTRY: Record<string, PluginRegistryEntry>;
19
21
  * 1. Official: @mediaproc/<name> (e.g., @mediaproc/image)
20
22
  * 2. Community: mediaproc-<name> (e.g., mediaproc-super-filters)
21
23
  * 3. Third-party: any npm package (e.g., my-custom-mediaproc-plugin)
24
+ * @throws {Error} If plugin name is empty or invalid
22
25
  */
23
26
  export declare function resolvePluginPackage(shortName: string): string;
24
27
  /**
25
28
  * Detect plugin type from package name
29
+ * @param packageName - Full package name
30
+ * @returns Plugin type: official, community, or third-party
26
31
  */
27
32
  export declare function detectPluginType(packageName: string): 'official' | 'community' | 'third-party';
28
33
  /**
29
34
  * Get all available plugins grouped by category
30
35
  */
31
36
  export declare function getPluginsByCategory(): Record<string, PluginRegistryEntry[]>;
37
+ /**
38
+ * Get all plugins (unique by package)
39
+ */
40
+ export declare function getAllPlugins(): PluginRegistryEntry[];
41
+ /**
42
+ * Search plugins by keyword
43
+ */
44
+ export declare function searchPlugins(keyword: string): PluginRegistryEntry[];
45
+ /**
46
+ * Get plugin entry by package name
47
+ */
48
+ export declare function getPluginEntry(packageName: string): PluginRegistryEntry | undefined;
32
49
  /**
33
50
  * Check if a plugin exists in registry
34
51
  */
35
52
  export declare function isValidPlugin(name: string): boolean;
36
- //# sourceMappingURL=plugin-registry.d.ts.map
53
+ /**
54
+ * Get plugin category
55
+ */
56
+ export declare function getPluginCategory(packageName: string): string | undefined;
57
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/utils/plugins/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,cAAc,CAAC;IAC/C,IAAI,EAAE,UAAU,GAAG,WAAW,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAqL/D,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA8B9D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,aAAa,CAc9F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAiB5E;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,mBAAmB,EAAE,CAYrD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAmBpE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAOnF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGzE"}
@@ -12,6 +12,8 @@ export const PLUGIN_REGISTRY = {
12
12
  category: 'core',
13
13
  type: 'official',
14
14
  systemRequirements: ['Sharp (auto-installed)'],
15
+ keywords: ['image', 'photo', 'resize', 'convert', 'filter', 'compress'],
16
+ documentation: 'https://docs.mediaproc.io/plugins/image'
15
17
  },
16
18
  'video': {
17
19
  name: 'video',
@@ -20,6 +22,8 @@ export const PLUGIN_REGISTRY = {
20
22
  category: 'core',
21
23
  type: 'official',
22
24
  systemRequirements: ['FFmpeg'],
25
+ keywords: ['video', 'movie', 'transcode', 'compress', 'extract', 'trim'],
26
+ documentation: 'https://docs.mediaproc.io/plugins/video'
23
27
  },
24
28
  'audio': {
25
29
  name: 'audio',
@@ -28,6 +32,8 @@ export const PLUGIN_REGISTRY = {
28
32
  category: 'core',
29
33
  type: 'official',
30
34
  systemRequirements: ['FFmpeg'],
35
+ keywords: ['audio', 'music', 'sound', 'convert', 'normalize', 'extract'],
36
+ documentation: 'https://docs.mediaproc.io/plugins/audio'
31
37
  },
32
38
  // Document Media (Very Important)
33
39
  'document': {
@@ -37,6 +43,8 @@ export const PLUGIN_REGISTRY = {
37
43
  category: 'core',
38
44
  type: 'official',
39
45
  systemRequirements: ['Ghostscript', 'Tesseract OCR', 'Poppler'],
46
+ keywords: ['pdf', 'document', 'docx', 'ocr', 'compress'],
47
+ documentation: 'https://docs.mediaproc.io/plugins/document'
40
48
  },
41
49
  'doc': {
42
50
  name: 'doc',
@@ -44,6 +52,7 @@ export const PLUGIN_REGISTRY = {
44
52
  description: 'Alias for document plugin',
45
53
  category: 'core',
46
54
  type: 'official',
55
+ keywords: ['pdf', 'document', 'alias']
47
56
  },
48
57
  // Animation & Motion Media
49
58
  'animation': {
@@ -53,6 +62,8 @@ export const PLUGIN_REGISTRY = {
53
62
  category: 'core',
54
63
  type: 'official',
55
64
  systemRequirements: ['FFmpeg'],
65
+ keywords: ['gif', 'animation', 'webp', 'lottie', 'animated'],
66
+ documentation: 'https://docs.mediaproc.io/plugins/animation'
56
67
  },
57
68
  'anim': {
58
69
  name: 'anim',
@@ -60,6 +71,7 @@ export const PLUGIN_REGISTRY = {
60
71
  description: 'Alias for animation plugin',
61
72
  category: 'core',
62
73
  type: 'official',
74
+ keywords: ['animation', 'alias']
63
75
  },
64
76
  // 3D & Spatial Media (Advanced)
65
77
  '3d': {
@@ -69,6 +81,8 @@ export const PLUGIN_REGISTRY = {
69
81
  category: 'advanced',
70
82
  type: 'official',
71
83
  systemRequirements: ['gltf-transform'],
84
+ keywords: ['3d', 'model', 'gltf', 'glb', 'texture', 'ar', 'vr'],
85
+ documentation: 'https://docs.mediaproc.io/plugins/3d'
72
86
  },
73
87
  'spatial': {
74
88
  name: 'spatial',
@@ -76,6 +90,7 @@ export const PLUGIN_REGISTRY = {
76
90
  description: 'Alias for 3d plugin',
77
91
  category: 'advanced',
78
92
  type: 'official',
93
+ keywords: ['3d', 'spatial', 'alias']
79
94
  },
80
95
  // Metadata-only Processing (Underrated but Powerful)
81
96
  'metadata': {
@@ -85,6 +100,8 @@ export const PLUGIN_REGISTRY = {
85
100
  category: 'core',
86
101
  type: 'official',
87
102
  systemRequirements: ['ExifTool'],
103
+ keywords: ['metadata', 'exif', 'inspect', 'compliance'],
104
+ documentation: 'https://docs.mediaproc.io/plugins/metadata'
88
105
  },
89
106
  'meta': {
90
107
  name: 'meta',
@@ -92,6 +109,7 @@ export const PLUGIN_REGISTRY = {
92
109
  description: 'Alias for metadata plugin',
93
110
  category: 'core',
94
111
  type: 'official',
112
+ keywords: ['metadata', 'alias']
95
113
  },
96
114
  'inspect': {
97
115
  name: 'inspect',
@@ -99,6 +117,7 @@ export const PLUGIN_REGISTRY = {
99
117
  description: 'Alias for metadata plugin',
100
118
  category: 'core',
101
119
  type: 'official',
120
+ keywords: ['inspect', 'metadata', 'alias']
102
121
  },
103
122
  // Streaming & Packaging Media (Advanced, Industry-Relevant)
104
123
  'stream': {
@@ -108,6 +127,8 @@ export const PLUGIN_REGISTRY = {
108
127
  category: 'advanced',
109
128
  type: 'official',
110
129
  systemRequirements: ['FFmpeg', 'Shaka Packager (optional)'],
130
+ keywords: ['stream', 'hls', 'dash', 'manifest', 'packaging'],
131
+ documentation: 'https://docs.mediaproc.io/plugins/stream'
111
132
  },
112
133
  'streaming': {
113
134
  name: 'streaming',
@@ -115,6 +136,7 @@ export const PLUGIN_REGISTRY = {
115
136
  description: 'Alias for stream plugin',
116
137
  category: 'advanced',
117
138
  type: 'official',
139
+ keywords: ['streaming', 'alias']
118
140
  },
119
141
  // AI-Assisted Media (Future-Proof)
120
142
  'ai': {
@@ -124,6 +146,8 @@ export const PLUGIN_REGISTRY = {
124
146
  category: 'future-proof',
125
147
  type: 'official',
126
148
  systemRequirements: ['TensorFlow/ONNX Runtime (optional)', 'Whisper (optional)'],
149
+ keywords: ['ai', 'ml', 'caption', 'detection', 'blur', 'transcribe'],
150
+ documentation: 'https://docs.mediaproc.io/plugins/ai'
127
151
  },
128
152
  'ml': {
129
153
  name: 'ml',
@@ -131,6 +155,7 @@ export const PLUGIN_REGISTRY = {
131
155
  description: 'Alias for ai plugin',
132
156
  category: 'future-proof',
133
157
  type: 'official',
158
+ keywords: ['ml', 'ai', 'alias']
134
159
  },
135
160
  // Media Pipelines (Highest Level)
136
161
  'pipeline': {
@@ -140,6 +165,8 @@ export const PLUGIN_REGISTRY = {
140
165
  category: 'advanced',
141
166
  type: 'official',
142
167
  dependencies: ['Can use any installed plugins'],
168
+ keywords: ['pipeline', 'workflow', 'batch', 'yaml'],
169
+ documentation: 'https://docs.mediaproc.io/plugins/pipeline'
143
170
  },
144
171
  };
145
172
  /**
@@ -148,29 +175,48 @@ export const PLUGIN_REGISTRY = {
148
175
  * 1. Official: @mediaproc/<name> (e.g., @mediaproc/image)
149
176
  * 2. Community: mediaproc-<name> (e.g., mediaproc-super-filters)
150
177
  * 3. Third-party: any npm package (e.g., my-custom-mediaproc-plugin)
178
+ * @throws {Error} If plugin name is empty or invalid
151
179
  */
152
180
  export function resolvePluginPackage(shortName) {
181
+ // Validate input
182
+ if (!shortName || typeof shortName !== 'string') {
183
+ throw new Error('Plugin name cannot be empty');
184
+ }
185
+ const trimmed = shortName.trim();
186
+ if (!trimmed) {
187
+ throw new Error('Plugin name cannot be empty');
188
+ }
189
+ // Validate characters (basic npm package name validation)
190
+ if (!/^[@\w\-./]+$/.test(trimmed)) {
191
+ throw new Error(`Invalid plugin name: ${trimmed}`);
192
+ }
153
193
  // Already a full package name - return as-is
154
- if (shortName.includes('/') || shortName.startsWith('mediaproc-')) {
155
- return shortName;
194
+ if (trimmed.includes('/') || trimmed.startsWith('mediaproc-')) {
195
+ return trimmed;
156
196
  }
157
197
  // Look up in official registry first
158
- const entry = PLUGIN_REGISTRY[shortName.toLowerCase()];
198
+ const entry = PLUGIN_REGISTRY[trimmed.toLowerCase()];
159
199
  if (entry) {
160
200
  return entry.package;
161
201
  }
162
202
  // Not in registry - could be community or third-party
163
203
  // Assume community format: mediaproc-<name>
164
- return `mediaproc-${shortName}`;
204
+ return `mediaproc-${trimmed}`;
165
205
  }
166
206
  /**
167
207
  * Detect plugin type from package name
208
+ * @param packageName - Full package name
209
+ * @returns Plugin type: official, community, or third-party
168
210
  */
169
211
  export function detectPluginType(packageName) {
170
- if (packageName.startsWith('@mediaproc/')) {
212
+ if (!packageName || typeof packageName !== 'string') {
213
+ return 'third-party';
214
+ }
215
+ const trimmed = packageName.trim();
216
+ if (trimmed.startsWith('@mediaproc/')) {
171
217
  return 'official';
172
218
  }
173
- if (packageName.startsWith('mediaproc-')) {
219
+ if (trimmed.startsWith('mediaproc-')) {
174
220
  return 'community';
175
221
  }
176
222
  return 'third-party';
@@ -193,10 +239,62 @@ export function getPluginsByCategory() {
193
239
  }
194
240
  return grouped;
195
241
  }
242
+ /**
243
+ * Get all plugins (unique by package)
244
+ */
245
+ export function getAllPlugins() {
246
+ const seen = new Set();
247
+ const plugins = [];
248
+ for (const entry of Object.values(PLUGIN_REGISTRY)) {
249
+ if (!seen.has(entry.package)) {
250
+ plugins.push(entry);
251
+ seen.add(entry.package);
252
+ }
253
+ }
254
+ return plugins;
255
+ }
256
+ /**
257
+ * Search plugins by keyword
258
+ */
259
+ export function searchPlugins(keyword) {
260
+ const lowerKeyword = keyword.toLowerCase();
261
+ const seen = new Set();
262
+ const results = [];
263
+ for (const entry of Object.values(PLUGIN_REGISTRY)) {
264
+ if (seen.has(entry.package))
265
+ continue;
266
+ const matchesName = entry.name.toLowerCase().includes(lowerKeyword);
267
+ const matchesDescription = entry.description.toLowerCase().includes(lowerKeyword);
268
+ const matchesKeywords = entry.keywords?.some(k => k.toLowerCase().includes(lowerKeyword));
269
+ if (matchesName || matchesDescription || matchesKeywords) {
270
+ results.push(entry);
271
+ seen.add(entry.package);
272
+ }
273
+ }
274
+ return results;
275
+ }
276
+ /**
277
+ * Get plugin entry by package name
278
+ */
279
+ export function getPluginEntry(packageName) {
280
+ for (const entry of Object.values(PLUGIN_REGISTRY)) {
281
+ if (entry.package === packageName) {
282
+ return entry;
283
+ }
284
+ }
285
+ return undefined;
286
+ }
196
287
  /**
197
288
  * Check if a plugin exists in registry
198
289
  */
199
290
  export function isValidPlugin(name) {
200
291
  return name.startsWith('@mediaproc/') || name.toLowerCase() in PLUGIN_REGISTRY;
201
292
  }
202
- //# sourceMappingURL=plugin-registry.js.map
293
+ /**
294
+ * Get plugin category
295
+ */
296
+ export function getPluginCategory(packageName) {
297
+ const entry = getPluginEntry(packageName);
298
+ return entry?.category;
299
+ }
300
+ //# sourceMappingURL=registry.js.map