bun_plugins 1.1.2 → 1.2.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 (180) hide show
  1. package/README.md +2 -2
  2. package/dist/Plugin.d.ts +28 -0
  3. package/dist/Plugin.d.ts.map +1 -0
  4. package/dist/Plugin.js +36 -0
  5. package/dist/Plugin.js.map +1 -0
  6. package/dist/PluginManager.d.ts +6 -0
  7. package/dist/PluginManager.d.ts.map +1 -1
  8. package/dist/PluginManager.js +84 -42
  9. package/dist/PluginManager.js.map +1 -1
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +2 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/logger/LoggerAdapter.d.ts +77 -0
  15. package/dist/logger/LoggerAdapter.d.ts.map +1 -0
  16. package/dist/logger/LoggerAdapter.js +244 -0
  17. package/dist/logger/LoggerAdapter.js.map +1 -0
  18. package/dist/logger/LoggerFactory.d.ts +73 -0
  19. package/dist/logger/LoggerFactory.d.ts.map +1 -0
  20. package/dist/logger/LoggerFactory.js +99 -0
  21. package/dist/logger/LoggerFactory.js.map +1 -0
  22. package/dist/logger/index.d.ts +3 -0
  23. package/dist/logger/index.d.ts.map +1 -0
  24. package/dist/logger/index.js +3 -0
  25. package/dist/logger/index.js.map +1 -0
  26. package/dist/managers/ContextFactory.d.ts.map +1 -1
  27. package/dist/managers/ContextFactory.js +13 -9
  28. package/dist/managers/ContextFactory.js.map +1 -1
  29. package/dist/managers/DependencyManager.d.ts.map +1 -1
  30. package/dist/managers/DependencyManager.js +2 -1
  31. package/dist/managers/DependencyManager.js.map +1 -1
  32. package/dist/managers/HooksManager.d.ts +4 -1
  33. package/dist/managers/HooksManager.d.ts.map +1 -1
  34. package/dist/managers/HooksManager.js +36 -8
  35. package/dist/managers/HooksManager.js.map +1 -1
  36. package/dist/managers/ResourceManager.d.ts.map +1 -1
  37. package/dist/managers/ResourceManager.js +2 -1
  38. package/dist/managers/ResourceManager.js.map +1 -1
  39. package/dist/pluginRegistry.d.ts +13 -0
  40. package/dist/pluginRegistry.d.ts.map +1 -0
  41. package/dist/pluginRegistry.js +11 -0
  42. package/dist/pluginRegistry.js.map +1 -0
  43. package/dist/plugins/ActionRegistryPlugin.d.ts +23 -0
  44. package/dist/plugins/ActionRegistryPlugin.d.ts.map +1 -0
  45. package/dist/plugins/ActionRegistryPlugin.js +56 -0
  46. package/dist/plugins/ActionRegistryPlugin.js.map +1 -0
  47. package/dist/plugins/DynamicJSActionsPlugin.d.ts +21 -0
  48. package/dist/plugins/DynamicJSActionsPlugin.d.ts.map +1 -0
  49. package/dist/plugins/DynamicJSActionsPlugin.js +57 -0
  50. package/dist/plugins/DynamicJSActionsPlugin.js.map +1 -0
  51. package/dist/plugins/DynamicMathActionsPlugin.d.ts +22 -0
  52. package/dist/plugins/DynamicMathActionsPlugin.d.ts.map +1 -0
  53. package/dist/plugins/DynamicMathActionsPlugin.js +64 -0
  54. package/dist/plugins/DynamicMathActionsPlugin.js.map +1 -0
  55. package/dist/plugins/DynamicTextActionsPlugin.d.ts +22 -0
  56. package/dist/plugins/DynamicTextActionsPlugin.d.ts.map +1 -0
  57. package/dist/plugins/DynamicTextActionsPlugin.js +58 -0
  58. package/dist/plugins/DynamicTextActionsPlugin.js.map +1 -0
  59. package/dist/plugins/DynamicUtilityActionsPlugin.d.ts +22 -0
  60. package/dist/plugins/DynamicUtilityActionsPlugin.d.ts.map +1 -0
  61. package/dist/plugins/DynamicUtilityActionsPlugin.js +75 -0
  62. package/dist/plugins/DynamicUtilityActionsPlugin.js.map +1 -0
  63. package/dist/plugins/ExamplePlugin.d.ts +3 -0
  64. package/dist/plugins/ExamplePlugin.d.ts.map +1 -0
  65. package/dist/plugins/ExamplePlugin.js +41 -0
  66. package/dist/plugins/ExamplePlugin.js.map +1 -0
  67. package/dist/plugins/LifecycleDemoPlugin.d.ts +20 -0
  68. package/dist/plugins/LifecycleDemoPlugin.d.ts.map +1 -0
  69. package/dist/plugins/LifecycleDemoPlugin.js +34 -0
  70. package/dist/plugins/LifecycleDemoPlugin.js.map +1 -0
  71. package/dist/plugins/MathPlugin.d.ts +16 -0
  72. package/dist/plugins/MathPlugin.d.ts.map +1 -0
  73. package/dist/plugins/MathPlugin.js +25 -0
  74. package/dist/plugins/MathPlugin.js.map +1 -0
  75. package/dist/plugins/MyJSPlugin.d.ts +7 -0
  76. package/dist/plugins/MyJSPlugin.d.ts.map +1 -0
  77. package/dist/plugins/MyJSPlugin.js +12 -0
  78. package/dist/plugins/MyJSPlugin.js.map +1 -0
  79. package/dist/plugins/arktype/index.d.ts +8 -0
  80. package/dist/plugins/arktype/index.d.ts.map +1 -0
  81. package/dist/plugins/arktype/index.js +25 -0
  82. package/dist/plugins/arktype/index.js.map +1 -0
  83. package/dist/src/Plugin.d.ts +28 -0
  84. package/dist/src/Plugin.d.ts.map +1 -0
  85. package/dist/src/Plugin.js +36 -0
  86. package/dist/src/Plugin.js.map +1 -0
  87. package/dist/src/PluginManager.d.ts +74 -0
  88. package/dist/src/PluginManager.d.ts.map +1 -0
  89. package/dist/src/PluginManager.js +689 -0
  90. package/dist/src/PluginManager.js.map +1 -0
  91. package/dist/src/index.d.ts +7 -0
  92. package/dist/src/index.d.ts.map +1 -0
  93. package/dist/src/index.js +7 -0
  94. package/dist/src/index.js.map +1 -0
  95. package/dist/src/logger/LoggerAdapter.d.ts +77 -0
  96. package/dist/src/logger/LoggerAdapter.d.ts.map +1 -0
  97. package/dist/src/logger/LoggerAdapter.js +242 -0
  98. package/dist/src/logger/LoggerAdapter.js.map +1 -0
  99. package/dist/src/logger/LoggerFactory.d.ts +73 -0
  100. package/dist/src/logger/LoggerFactory.d.ts.map +1 -0
  101. package/dist/src/logger/LoggerFactory.js +99 -0
  102. package/dist/src/logger/LoggerFactory.js.map +1 -0
  103. package/dist/src/logger/index.d.ts +3 -0
  104. package/dist/src/logger/index.d.ts.map +1 -0
  105. package/dist/src/logger/index.js +3 -0
  106. package/dist/src/logger/index.js.map +1 -0
  107. package/dist/src/managers/ContextFactory.d.ts +6 -0
  108. package/dist/src/managers/ContextFactory.d.ts.map +1 -0
  109. package/dist/src/managers/ContextFactory.js +132 -0
  110. package/dist/src/managers/ContextFactory.js.map +1 -0
  111. package/dist/src/managers/DependencyManager.d.ts +10 -0
  112. package/dist/src/managers/DependencyManager.d.ts.map +1 -0
  113. package/dist/src/managers/DependencyManager.js +96 -0
  114. package/dist/src/managers/DependencyManager.js.map +1 -0
  115. package/dist/src/managers/HooksManager.d.ts +24 -0
  116. package/dist/src/managers/HooksManager.d.ts.map +1 -0
  117. package/dist/src/managers/HooksManager.js +145 -0
  118. package/dist/src/managers/HooksManager.js.map +1 -0
  119. package/dist/src/managers/ResourceManager.d.ts +16 -0
  120. package/dist/src/managers/ResourceManager.d.ts.map +1 -0
  121. package/dist/src/managers/ResourceManager.js +50 -0
  122. package/dist/src/managers/ResourceManager.js.map +1 -0
  123. package/dist/src/pluginRegistry.d.ts +13 -0
  124. package/dist/src/pluginRegistry.d.ts.map +1 -0
  125. package/dist/src/pluginRegistry.js +11 -0
  126. package/dist/src/pluginRegistry.js.map +1 -0
  127. package/dist/src/storage/JsonPluginStorage.d.ts +15 -0
  128. package/dist/src/storage/JsonPluginStorage.d.ts.map +1 -0
  129. package/dist/src/storage/JsonPluginStorage.js +75 -0
  130. package/dist/src/storage/JsonPluginStorage.js.map +1 -0
  131. package/dist/src/types/arktype_converter.d.ts +19 -0
  132. package/dist/src/types/arktype_converter.d.ts.map +1 -0
  133. package/dist/src/types/arktype_converter.js +73 -0
  134. package/dist/src/types/arktype_converter.js.map +1 -0
  135. package/dist/src/types/generator.d.ts +8 -0
  136. package/dist/src/types/generator.d.ts.map +1 -0
  137. package/dist/src/types/generator.js +9 -0
  138. package/dist/src/types/generator.js.map +1 -0
  139. package/dist/src/types/interfaces.d.ts +55 -0
  140. package/dist/src/types/interfaces.d.ts.map +1 -0
  141. package/dist/src/types/interfaces.js +5 -0
  142. package/dist/src/types/interfaces.js.map +1 -0
  143. package/dist/src/types/plugin-registry.d.ts +21 -0
  144. package/dist/src/types/plugin-registry.d.ts.map +1 -0
  145. package/dist/src/types/plugin-registry.js +4 -0
  146. package/dist/src/types/plugin-registry.js.map +1 -0
  147. package/dist/src/types/plugin_generator.d.ts +56 -0
  148. package/dist/src/types/plugin_generator.d.ts.map +1 -0
  149. package/dist/src/types/plugin_generator.js +659 -0
  150. package/dist/src/types/plugin_generator.js.map +1 -0
  151. package/dist/src/types.d.ts +211 -0
  152. package/dist/src/types.d.ts.map +1 -0
  153. package/dist/src/types.js +62 -0
  154. package/dist/src/types.js.map +1 -0
  155. package/dist/src/utils/errorParser.d.ts +3 -0
  156. package/dist/src/utils/errorParser.d.ts.map +1 -0
  157. package/dist/src/utils/errorParser.js +23 -0
  158. package/dist/src/utils/errorParser.js.map +1 -0
  159. package/dist/src/utils/pluginValidator.d.ts +17 -0
  160. package/dist/src/utils/pluginValidator.d.ts.map +1 -0
  161. package/dist/src/utils/pluginValidator.js +74 -0
  162. package/dist/src/utils/pluginValidator.js.map +1 -0
  163. package/dist/src/utils/security.d.ts +3 -0
  164. package/dist/src/utils/security.d.ts.map +1 -0
  165. package/dist/src/utils/security.js +26 -0
  166. package/dist/src/utils/security.js.map +1 -0
  167. package/dist/src/worker/WorkerRunner.d.ts +2 -0
  168. package/dist/src/worker/WorkerRunner.d.ts.map +1 -0
  169. package/dist/src/worker/WorkerRunner.js +274 -0
  170. package/dist/src/worker/WorkerRunner.js.map +1 -0
  171. package/dist/storage/JsonPluginStorage.d.ts.map +1 -1
  172. package/dist/storage/JsonPluginStorage.js +3 -2
  173. package/dist/storage/JsonPluginStorage.js.map +1 -1
  174. package/dist/types.d.ts +22 -6
  175. package/dist/types.d.ts.map +1 -1
  176. package/dist/types.js +1 -1
  177. package/dist/types.js.map +1 -1
  178. package/dist/worker/WorkerRunner.js +21 -9
  179. package/dist/worker/WorkerRunner.js.map +1 -1
  180. package/package.json +4 -3
package/README.md CHANGED
@@ -163,7 +163,7 @@ Plugins can share APIs with each other safely:
163
163
  // Plugin A: Exposes an API
164
164
  export class ProviderPlugin implements IPlugin {
165
165
  name = "db-provider";
166
- getSharedApi() {
166
+ getApi() {
167
167
  return {
168
168
  query: (q: string) => `Result for ${q}`,
169
169
  };
@@ -174,7 +174,7 @@ export class ProviderPlugin implements IPlugin {
174
174
  export class ConsumerPlugin implements IPlugin {
175
175
  name = "app-logic";
176
176
  async onLoad(context: PluginContext) {
177
- const db = context.getPlugin("db-provider");
177
+ const db = await context.getPlugin("db-provider");
178
178
  const result = db.query("SELECT *");
179
179
  }
180
180
  }
@@ -0,0 +1,28 @@
1
+ import type { IPlugin, PluginContext, PluginBuilder, PluginPermission } from "./types";
2
+ import { z } from "zod";
3
+ /**
4
+ * Abstract base class for Plugins to extend.
5
+ * Provides default implementations for optional methods.
6
+ */
7
+ export declare abstract class Plugin implements IPlugin {
8
+ abstract name: string;
9
+ abstract version: string;
10
+ description?: string;
11
+ author?: string;
12
+ dependencies?: Record<string, string>;
13
+ permissions?: PluginPermission[];
14
+ allowedDomains?: string[];
15
+ configSchema?: z.ZodSchema;
16
+ defaultConfig?: Record<string, any>;
17
+ onLoad(context: PluginContext): Promise<void> | void;
18
+ onUnload(): Promise<void> | void;
19
+ onStarted(): Promise<void> | void;
20
+ onReload(context: PluginContext): Promise<void> | void;
21
+ setup(build: PluginBuilder): void | Promise<void>;
22
+ }
23
+ /**
24
+ * Helper function to define a plugin object with type inference.
25
+ * Useful for functional-style plugin definitions.
26
+ */
27
+ export declare function definePlugin(plugin: IPlugin): IPlugin;
28
+ //# sourceMappingURL=Plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../src/Plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,8BAAsB,MAAO,YAAW,OAAO;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEpC,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIpD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIhC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIjC,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAItD,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAGpD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAErD"}
package/dist/Plugin.js ADDED
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Abstract base class for Plugins to extend.
3
+ * Provides default implementations for optional methods.
4
+ */
5
+ export class Plugin {
6
+ description;
7
+ author;
8
+ dependencies;
9
+ permissions;
10
+ allowedDomains;
11
+ configSchema;
12
+ defaultConfig;
13
+ onLoad(context) {
14
+ // Default no-op
15
+ }
16
+ onUnload() {
17
+ // Default no-op
18
+ }
19
+ onStarted() {
20
+ // Default no-op
21
+ }
22
+ onReload(context) {
23
+ // Default no-op defined but not enforced by interface strictly if optional
24
+ }
25
+ setup(build) {
26
+ // Default no-op
27
+ }
28
+ }
29
+ /**
30
+ * Helper function to define a plugin object with type inference.
31
+ * Useful for functional-style plugin definitions.
32
+ */
33
+ export function definePlugin(plugin) {
34
+ return plugin;
35
+ }
36
+ //# sourceMappingURL=Plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Plugin.js","sourceRoot":"","sources":["../src/Plugin.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,OAAgB,MAAM;IAIxB,WAAW,CAAU;IACrB,MAAM,CAAU;IAChB,YAAY,CAA0B;IACtC,WAAW,CAAsB;IACjC,cAAc,CAAY;IAC1B,YAAY,CAAe;IAC3B,aAAa,CAAuB;IAEpC,MAAM,CAAC,OAAsB;QACzB,gBAAgB;IACpB,CAAC;IAED,QAAQ;QACJ,gBAAgB;IACpB,CAAC;IAED,SAAS;QACL,gBAAgB;IACpB,CAAC;IAED,QAAQ,CAAC,OAAsB;QAC3B,2EAA2E;IAC/E,CAAC;IAED,KAAK,CAAC,KAAoB;QACtB,gBAAgB;IACpB,CAAC;CACJ;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAAe;IACxC,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { EventEmitter } from "node:events";
2
2
  import { type IPlugin, type AppEvents, type BunWorkerOptions as WorkerOptions, type OnResolveArgs, type OnLoadArgs, type IPluginManager } from "./types";
3
+ import { PluginTypeByName, KnownPluginNames } from "./pluginRegistry";
3
4
  import { HooksManager } from "./managers/HooksManager";
4
5
  export declare class PluginManager extends EventEmitter implements IPluginManager {
5
6
  private plugins;
@@ -23,6 +24,7 @@ export declare class PluginManager extends EventEmitter implements IPluginManage
23
24
  registerIsolated(pluginPath: string, pluginName: string): Promise<void>;
24
25
  unregister(pluginName: string): Promise<void>;
25
26
  getPlugin(name: string): IPlugin | undefined;
27
+ getPlugin<TName extends string>(name: TName): TName extends KnownPluginNames ? PluginTypeByName<TName> : IPlugin | undefined;
26
28
  getPluginConfig(name: string): Record<string, any>;
27
29
  listPlugins(): string[];
28
30
  emit<K extends keyof AppEvents>(eventName: K, payload: AppEvents[K]): boolean;
@@ -46,6 +48,9 @@ export declare class PluginManager extends EventEmitter implements IPluginManage
46
48
  contents?: string;
47
49
  loader?: string;
48
50
  } | null>;
51
+ use(plugin: IPlugin): Promise<void>;
52
+ plugin(plugin: IPlugin): Promise<void>;
53
+ remove(pluginName: string): Promise<void>;
49
54
  toBunPlugin(): Bun.BunPlugin;
50
55
  private hotReloadTimer;
51
56
  enableHotReload(pluginDir: string): void;
@@ -59,6 +64,7 @@ export declare class PluginManager extends EventEmitter implements IPluginManage
59
64
  pluginCount: number;
60
65
  };
61
66
  hooks: {
67
+ onStart: number;
62
68
  onResolve: number;
63
69
  onLoad: number;
64
70
  };
@@ -1 +1 @@
1
- {"version":3,"file":"PluginManager.d.ts","sourceRoot":"","sources":["../src/PluginManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PluginManager.d.ts","sourceRoot":"","sources":["../src/PluginManager.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@ import { HooksManager } from "./managers/HooksManager";
12
12
  import { createPluginContext } from "./managers/ContextFactory";
13
13
  import { errorParser } from "./utils/errorParser";
14
14
  import { checkNetworkPermission, checkPermission as checkGeneralPermission } from "./utils/security";
15
+ import { logger } from "./logger";
15
16
  export class PluginManager extends EventEmitter {
16
17
  plugins = new Map();
17
18
  availablePlugins = new Map();
@@ -60,7 +61,7 @@ export class PluginManager extends EventEmitter {
60
61
  throw new Error(`Plugin ${plugin.name} requires host version ${plugin.engines.host}, but found ${this.hostVersion}`);
61
62
  }
62
63
  }
63
- console.log(`Loading plugin: ${plugin.name} v${plugin.version}`);
64
+ logger.getLogger("PluginManager").info(`Loading plugin: ${plugin.name} v${plugin.version}`);
64
65
  // 1. Prepare Storage
65
66
  const storage = new JsonPluginStorage(this.storageRoot, plugin.name);
66
67
  // 2. Load & Validate Configuration
@@ -71,7 +72,7 @@ export class PluginManager extends EventEmitter {
71
72
  }
72
73
  catch (e) {
73
74
  const error = errorParser(e, `Error in plugin ${plugin.name}`);
74
- console.warn(`[SafeMode] Using default config, validation failed. Error: ${error.message}`);
75
+ logger.getLogger("PluginManager").warn(`[SafeMode] Using default config, validation failed. Error: ${error.message}`);
75
76
  }
76
77
  }
77
78
  // 3. Initialize Resources
@@ -86,10 +87,10 @@ export class PluginManager extends EventEmitter {
86
87
  // 5. Setup Hooks with Performance Monitoring (Delegated to HooksManager via Builder)
87
88
  if (plugin.setup) {
88
89
  try {
89
- await plugin.setup(this.hooksManager.getBuilder(plugin.name));
90
+ await plugin.setup(this.hooksManager.getBuilder(plugin.name, config));
90
91
  }
91
92
  catch (e) {
92
- console.error(`Error during setup for ${plugin.name}:`, e);
93
+ logger.getLogger("PluginManager").error(`Error during setup for ${plugin.name}:`, e);
93
94
  throw errorParser(e, `Error during setup for ${plugin.name}`);
94
95
  }
95
96
  }
@@ -100,19 +101,21 @@ export class PluginManager extends EventEmitter {
100
101
  await Promise.race([plugin.onLoad(context), timeoutPromise]);
101
102
  const duration = performance.now() - start;
102
103
  this.plugins.set(plugin.name, plugin);
103
- console.log(`Plugin ${plugin.name} loaded successfully in ${duration.toFixed(2)}ms.`);
104
+ logger.getLogger("PluginManager").info(`Plugin ${plugin.name} loaded successfully in ${duration.toFixed(2)}ms.`);
104
105
  // Trigger onStarted after registration if provided
105
106
  if (plugin.onStarted) {
106
107
  try {
107
108
  await plugin.onStarted();
108
109
  }
109
110
  catch (e) {
110
- console.error(`Error in onStarted for ${plugin.name}:`, e);
111
+ logger.getLogger("PluginManager").error(`Error in onStarted for ${plugin.name}:`, e);
111
112
  }
112
113
  }
114
+ // 7. Trigger onStart hooks registered via setup()
115
+ await this.hooksManager.runOnStart();
113
116
  }
114
117
  catch (error) {
115
- console.error(`Failed to load plugin ${plugin.name}:`, error);
118
+ logger.getLogger("PluginManager").error(`Failed to load plugin ${plugin.name}:`, error);
116
119
  // Cleanup resources directly since plugin is not in this.plugins yet
117
120
  this.resources.cleanup(plugin.name, this);
118
121
  this.hooksManager.cleanup(plugin.name);
@@ -122,7 +125,7 @@ export class PluginManager extends EventEmitter {
122
125
  async registerIsolated(pluginPath, pluginName) {
123
126
  return new Promise((resolve, reject) => {
124
127
  const workerScript = this.workerRunnerPath;
125
- console.log("Worker Path:", workerScript);
128
+ logger.getLogger("PluginManager").info("Worker Path:", workerScript);
126
129
  const timeoutId = setTimeout(() => {
127
130
  worker.terminate();
128
131
  reject(new Error(`Isolated plugin ${pluginName} timed out during loading (${this.pluginLoadTimeout}ms)`));
@@ -203,16 +206,22 @@ export class PluginManager extends EventEmitter {
203
206
  else if (type === HookType.ON_LOAD) {
204
207
  this.hooksManager.registerOnLoad(filterRegExp, proxyCallback, pluginName, options?.order);
205
208
  }
209
+ else if (type === HookType.ON_START) {
210
+ this.hooksManager.registerOnStart(() => proxyCallback({}), pluginName);
211
+ }
206
212
  result = true;
207
213
  }
208
214
  else if (method === RPCMethod.ManagerGetPlugin) {
209
215
  const targetName = args[0];
210
216
  const p = this.getPlugin(targetName);
211
- result = p?.getSharedApi ? p.getSharedApi() : undefined;
217
+ result = p && typeof p === 'object' && 'getSharedApi' in p && typeof p.getSharedApi === 'function'
218
+ ? p.getSharedApi()
219
+ : undefined;
212
220
  }
213
221
  else if (method === RPCMethod.Log) {
214
222
  const level = args[0];
215
- console[level](`[${pluginName}]`, ...args.slice(1));
223
+ const [msg, ...restArgs] = args.slice(1);
224
+ logger.getLogger(pluginName)[level](msg, ...restArgs);
216
225
  result = true;
217
226
  }
218
227
  else if (method === RPCMethod.PermissionCheck) {
@@ -270,7 +279,7 @@ export class PluginManager extends EventEmitter {
270
279
  else if (msg.type === WorkerMessageType.MANIFEST) {
271
280
  const { metadata } = msg;
272
281
  pluginMetadata = metadata;
273
- console.log(`Metadata received for isolated plugin: ${metadata.name}`);
282
+ logger.getLogger("PluginManager").info(`Metadata received for isolated plugin: ${metadata.name}`);
274
283
  }
275
284
  else if (msg.type === WorkerMessageType.LOAD_SUCCESS) {
276
285
  clearTimeout(timeoutId); // Success, clear global timeout
@@ -300,7 +309,7 @@ export class PluginManager extends EventEmitter {
300
309
  },
301
310
  };
302
311
  this.plugins.set(metadata.name, proxyPlugin);
303
- console.log(`Isolated Plugin ${metadata.name} loaded in worker.`);
312
+ logger.getLogger("PluginManager").info(`Isolated Plugin ${metadata.name} loaded in worker.`);
304
313
  resolve();
305
314
  }
306
315
  else if (msg.type === WorkerMessageType.LOAD_ERROR) {
@@ -317,7 +326,7 @@ export class PluginManager extends EventEmitter {
317
326
  worker.addEventListener("message", (event) => rpcHandler(event.data));
318
327
  worker.addEventListener("error", (err) => {
319
328
  clearTimeout(timeoutId);
320
- console.error(`[Isolated:${pluginName}] Worker Error:`, err);
329
+ logger.getLogger("PluginManager").error(`[Isolated:${pluginName}] Worker Error:`, err);
321
330
  // Reject all pending hooks on crash
322
331
  for (const pending of Array.from(pendingHooks.values())) {
323
332
  pending.reject(new Error("Worker terminated unexpectedly"));
@@ -333,24 +342,31 @@ export class PluginManager extends EventEmitter {
333
342
  return;
334
343
  for (const [name, p] of Array.from(this.plugins.entries())) {
335
344
  if (p.dependencies && p.dependencies[pluginName]) {
336
- console.warn(`Warning: Plugin ${name} depends on ${pluginName} which is being unloaded.`);
345
+ logger.getLogger("PluginManager").warn(`Warning: Plugin ${name} depends on ${pluginName} which is being unloaded.`);
337
346
  }
338
347
  }
339
348
  try {
340
349
  await plugin.onUnload();
341
350
  }
342
351
  catch (error) {
343
- console.error(`Error unloading plugin ${pluginName}:`, error);
352
+ logger.getLogger("PluginManager").error(`Error unloading plugin ${pluginName}:`, error);
344
353
  }
345
354
  finally {
346
355
  this.plugins.delete(pluginName);
347
356
  this.resources.cleanup(pluginName, this);
348
357
  this.hooksManager.cleanup(pluginName);
349
- console.log(`Plugin ${pluginName} unloaded.`);
358
+ logger.getLogger("PluginManager").info(`Plugin ${pluginName} unloaded.`);
350
359
  }
351
360
  }
352
361
  getPlugin(name) {
353
- return this.plugins.get(name);
362
+ const plugin = this.plugins.get(name);
363
+ if (!plugin)
364
+ return undefined;
365
+ // Si el plugin tiene getSharedApi, retornar la API compartida
366
+ if (plugin.getSharedApi) {
367
+ return plugin.getSharedApi();
368
+ }
369
+ return plugin;
354
370
  }
355
371
  getPluginConfig(name) {
356
372
  return this.configs.get(name) || {};
@@ -382,7 +398,7 @@ export class PluginManager extends EventEmitter {
382
398
  }
383
399
  }
384
400
  catch (e) {
385
- console.warn("Failed to load global plugin config", e);
401
+ logger.getLogger("PluginManager").warn("Failed to load global plugin config", e);
386
402
  }
387
403
  const entries = await readdir(directoryPath, { withFileTypes: true });
388
404
  this.availablePlugins.clear();
@@ -408,7 +424,9 @@ export class PluginManager extends EventEmitter {
408
424
  }
409
425
  if (fullPath) {
410
426
  try {
411
- const module = await import(fullPath);
427
+ // Use cache-busting for hot reload
428
+ const query = `?update=${Date.now()}`;
429
+ const module = await import(fullPath + query);
412
430
  for (const key in module) {
413
431
  const ExportedItem = module[key];
414
432
  const validation = validatePlugin(ExportedItem);
@@ -417,12 +435,12 @@ export class PluginManager extends EventEmitter {
417
435
  }
418
436
  else {
419
437
  const errorMsg = validation.error;
420
- console.warn(`Skipping invalid plugin item in ${entry.name}: ${errorMsg}`);
438
+ logger.getLogger("PluginManager").warn(`Skipping invalid plugin item in ${entry.name}: ${errorMsg}`);
421
439
  }
422
440
  }
423
441
  }
424
442
  catch (err) {
425
- console.error(`Error importing ${fullPath}:`, err);
443
+ logger.getLogger("PluginManager").error(`Error importing ${fullPath}:`, err);
426
444
  }
427
445
  }
428
446
  }
@@ -432,7 +450,7 @@ export class PluginManager extends EventEmitter {
432
450
  pluginsToLoad.push(plugin);
433
451
  }
434
452
  else {
435
- console.log(`Plugin ${plugin.name} is disabled.`);
453
+ logger.getLogger("PluginManager").info(`Plugin ${plugin.name} is disabled.`);
436
454
  }
437
455
  }
438
456
  try {
@@ -443,7 +461,7 @@ export class PluginManager extends EventEmitter {
443
461
  if (plugin.dependencies) {
444
462
  for (const dep of Object.keys(plugin.dependencies)) {
445
463
  if (!this.plugins.has(dep)) {
446
- console.warn(`Skipping ${plugin.name}: Dependency ${dep} failed to load or is missing.`);
464
+ logger.getLogger("PluginManager").warn(`Skipping ${plugin.name}: Dependency ${dep} failed to load or is missing.`);
447
465
  dependenciesOk = false;
448
466
  break;
449
467
  }
@@ -452,13 +470,18 @@ export class PluginManager extends EventEmitter {
452
470
  if (!dependenciesOk)
453
471
  continue;
454
472
  try {
455
- if (!this.plugins.has(plugin.name)) {
473
+ if (this.plugins.has(plugin.name)) {
474
+ logger.getLogger("PluginManager").info(`Updating plugin: ${plugin.name}`);
475
+ await this.reloadPlugin(plugin.name);
476
+ loadedPlugins.push(plugin);
477
+ }
478
+ else {
456
479
  await this.register(plugin);
457
480
  loadedPlugins.push(plugin);
458
481
  }
459
482
  }
460
483
  catch (e) {
461
- console.error(`Failed to load ${plugin.name}:`, e);
484
+ logger.getLogger("PluginManager").error(`Failed to load/update ${plugin.name}:`, e);
462
485
  }
463
486
  }
464
487
  for (const plugin of loadedPlugins) {
@@ -467,23 +490,23 @@ export class PluginManager extends EventEmitter {
467
490
  await plugin.onStarted();
468
491
  }
469
492
  catch (e) {
470
- console.error(`Error in onStarted for ${plugin.name}:`, e);
493
+ logger.getLogger("PluginManager").error(`Error in onStarted for ${plugin.name}:`, e);
471
494
  }
472
495
  }
473
496
  }
474
497
  }
475
498
  catch (e) {
476
- console.error("Failed to resolve plugin dependencies or load plugins:", e);
499
+ logger.getLogger("PluginManager").error("Failed to resolve plugin dependencies or load plugins:", e);
477
500
  }
478
501
  }
479
502
  catch (error) {
480
- console.error(`Failed to load plugins from ${directoryPath}`, error);
503
+ logger.getLogger("PluginManager").error(`Failed to load plugins from ${directoryPath}`, error);
481
504
  }
482
505
  }
483
506
  async disablePlugin(name) {
484
507
  await this.unregister(name);
485
508
  await this.updatePluginState(name, true);
486
- console.log(`Plugin ${name} disabled.`);
509
+ logger.getLogger("PluginManager").info(`Plugin ${name} disabled.`);
487
510
  }
488
511
  async enablePlugin(name) {
489
512
  await this.updatePluginState(name, false);
@@ -493,7 +516,7 @@ export class PluginManager extends EventEmitter {
493
516
  if (plugin.dependencies) {
494
517
  for (const dep of Object.keys(plugin.dependencies)) {
495
518
  if (!this.plugins.has(dep)) {
496
- console.warn(`Cannot enable ${name}: Dependency ${dep} is not loaded.`);
519
+ logger.getLogger("PluginManager").warn(`Cannot enable ${name}: Dependency ${dep} is not loaded.`);
497
520
  return;
498
521
  }
499
522
  }
@@ -501,19 +524,33 @@ export class PluginManager extends EventEmitter {
501
524
  await this.register(plugin);
502
525
  }
503
526
  else {
504
- console.warn(`Plugin ${name} enabled but not found in available plugins.`);
527
+ logger.getLogger("PluginManager").warn(`Plugin ${name} enabled but not found in available plugins.`);
505
528
  }
506
529
  }
507
530
  }
508
531
  async reloadPlugin(name) {
509
- const plugin = this.plugins.get(name);
510
- if (plugin) {
511
- console.log(`Reloading plugin ${name}...`);
532
+ const oldPlugin = this.plugins.get(name);
533
+ if (oldPlugin) {
534
+ logger.getLogger("PluginManager").info(`Reloading plugin ${name}...`);
512
535
  await this.unregister(name);
513
536
  }
514
537
  const definition = this.availablePlugins.get(name);
515
538
  if (definition) {
516
539
  await this.register(definition);
540
+ const newPlugin = this.plugins.get(name);
541
+ // If the new version has onReload, call it
542
+ if (newPlugin && newPlugin.onReload) {
543
+ // We need a context for onReload as well
544
+ const storage = new JsonPluginStorage(this.storageRoot, name);
545
+ const context = createPluginContext(this, newPlugin, this.resources, storage);
546
+ try {
547
+ await newPlugin.onReload(context);
548
+ }
549
+ catch (e) {
550
+ logger.getLogger("PluginManager").error(`Error in onReload for ${name}:`, e);
551
+ }
552
+ }
553
+ this.emit("plugin:updated", { name: definition.name, version: definition.version });
517
554
  }
518
555
  else {
519
556
  throw new Error(`Plugin ${name} not found in available plugins.`);
@@ -539,7 +576,7 @@ export class PluginManager extends EventEmitter {
539
576
  await Bun.write(globalConfigPath, JSON.stringify(config, null, 2));
540
577
  }
541
578
  catch (e) {
542
- console.error("Failed to update plugin state", e);
579
+ logger.getLogger("PluginManager").error("Failed to update plugin state", e);
543
580
  }
544
581
  }
545
582
  async runOnResolve(args) {
@@ -548,19 +585,23 @@ export class PluginManager extends EventEmitter {
548
585
  async runOnLoad(args) {
549
586
  return this.hooksManager.runOnLoad(args);
550
587
  }
588
+ // Bun-like Aliases
589
+ async use(plugin) { return this.register(plugin); }
590
+ async plugin(plugin) { return this.register(plugin); }
591
+ async remove(pluginName) { return this.unregister(pluginName); }
551
592
  toBunPlugin() {
552
593
  return this.hooksManager.toBunPlugin();
553
594
  }
554
595
  hotReloadTimer = null;
555
596
  enableHotReload(pluginDir) {
556
- console.log(`[HotReload] Watching ${pluginDir} for changes...`);
597
+ logger.getLogger("PluginManager").info(`[HotReload] Watching ${pluginDir} for changes...`);
557
598
  watch(pluginDir, { recursive: true }, async (event, filename) => {
558
599
  if (!filename || (!filename.endsWith(".ts") && !filename.endsWith(".js")))
559
600
  return;
560
601
  if (this.hotReloadTimer)
561
602
  clearTimeout(this.hotReloadTimer);
562
603
  this.hotReloadTimer = setTimeout(async () => {
563
- console.log(`[HotReload] Change detected in ${filename}. Re-scanning plugins...`);
604
+ logger.getLogger("PluginManager").info(`[HotReload] Change detected in ${filename}. Re-scanning plugins...`);
564
605
  await this.loadPluginsFromDirectory(pluginDir);
565
606
  }, 300);
566
607
  });
@@ -571,6 +612,7 @@ export class PluginManager extends EventEmitter {
571
612
  activePlugins: Array.from(this.plugins.keys()),
572
613
  resources: this.resources.getUsageSummary(),
573
614
  hooks: {
615
+ onStart: this.hooksManager.getHookCount(HookType.ON_START),
574
616
  onResolve: this.hooksManager.getHookCount(HookType.ON_RESOLVE),
575
617
  onLoad: this.hooksManager.getHookCount(HookType.ON_LOAD)
576
618
  }
@@ -598,16 +640,16 @@ export class PluginManager extends EventEmitter {
598
640
  // 1. Check if we are in production
599
641
  const isProduction = process.env.NODE_ENV === "production";
600
642
  if (isProduction) {
601
- console.warn(`[PluginManager] Warning: Plugin at ${pluginPath} is missing node_modules. Auto-install is disabled in production.`);
643
+ logger.getLogger("PluginManager").warn(`[PluginManager] Warning: Plugin at ${pluginPath} is missing node_modules. Auto-install is disabled in production.`);
602
644
  return;
603
645
  }
604
646
  // 2. Check if 'bun' CLI is even available in the system
605
647
  const bunPath = Bun.which("bun");
606
648
  if (!bunPath) {
607
- console.warn(`[PluginManager] Warning: node_modules missing in ${pluginPath}, but 'bun' CLI was not found. Cannot auto-install.`);
649
+ logger.getLogger("PluginManager").warn(`[PluginManager] Warning: node_modules missing in ${pluginPath}, but 'bun' CLI was not found. Cannot auto-install.`);
608
650
  return;
609
651
  }
610
- console.log(`[PluginManager] Development mode detected. node_modules missing in ${pluginPath}. Installing deps...`);
652
+ logger.getLogger("PluginManager").info(`[PluginManager] Development mode detected. node_modules missing in ${pluginPath}. Installing deps...`);
611
653
  try {
612
654
  const proc = Bun.spawn([bunPath, "install"], {
613
655
  cwd: pluginPath,
@@ -616,11 +658,11 @@ export class PluginManager extends EventEmitter {
616
658
  });
617
659
  const exitCode = await proc.exited;
618
660
  if (exitCode !== 0) {
619
- console.error(`[PluginManager] Failed to install dependencies for ${pluginPath}. Exit code: ${exitCode}`);
661
+ logger.getLogger("PluginManager").error(`[PluginManager] Failed to install dependencies for ${pluginPath}. Exit code: ${exitCode}`);
620
662
  }
621
663
  }
622
664
  catch (e) {
623
- console.error(`[PluginManager] Error running bun install for ${pluginPath}:`, e);
665
+ logger.getLogger("PluginManager").error(`[PluginManager] Error running bun install for ${pluginPath}:`, e);
624
666
  }
625
667
  }
626
668
  }