Class: Insika::Plugin::Loader
- Inherits:
-
Object
- Object
- Insika::Plugin::Loader
- Defined in:
- lib/insika/plugin/loader.rb
Overview
Plugin loader. Runs EXCLUSIVELY at boot, single-fiber, before the server accepts connections — zero concurrency.
Manifest: discovery without executing code; the entry require only happens after validation. A plugin failure doesn't bring down boot (rollback + warn).
Defined Under Namespace
Modules: ConfigSchema Classes: Discovered, RegistrationAPI
Constant Summary collapse
- MANIFEST_GLOB =
"{insika.plugin.yml,plugin.yml}"- SUPPORTED_CONTRACTS =
%w[tools workflows capabilities channels].freeze
Instance Method Summary collapse
-
#enabled?(id, plugin_dir) ⇒ Boolean
Per-root-class enablement: an announced gem is default-enabled, disableable via disabled:; workspace and bundled require explicit enabled:.
-
#initialize(roots:, registries:, enabled:, event_stream:, announced_roots: [], disabled: []) ⇒ Loader
constructor
registries: { tools:, workflows:, policies: } (Registry), hooks: (Hooks), middleware:/context_providers: (collections that respond to <<).
-
#load_all ⇒ Object
-> { skill_dirs: [], prompt_dirs: [], plugins: [Discovered] }.
Constructor Details
#initialize(roots:, registries:, enabled:, event_stream:, announced_roots: [], disabled: []) ⇒ Loader
registries: { tools:, workflows:, policies: } (Registry), hooks: (Hooks), middleware:/context_providers: (collections that respond to <<). announced_roots:/disabled: materialize per-root-class enablement; empty defaults keep the signature valid.
24 25 26 27 28 29 30 31 32 |
# File 'lib/insika/plugin/loader.rb', line 24 def initialize(roots:, registries:, enabled:, event_stream:, announced_roots: [], disabled: []) @roots = Array(roots) @registries = registries @enabled = Array(enabled).map(&:to_s) @event_stream = event_stream @announced_roots = Array(announced_roots).map { |r| File.(r.to_s) } @disabled = Array(disabled).map(&:to_s) end |
Instance Method Details
#enabled?(id, plugin_dir) ⇒ Boolean
Per-root-class enablement: an announced gem is default-enabled, disableable via disabled:; workspace and bundled require explicit enabled:. disabled: is an absolute veto (deny wins, like the allowlists) — an id in disabled won't load even if it's in enabled.
68 69 70 71 72 |
# File 'lib/insika/plugin/loader.rb', line 68 def enabled?(id, plugin_dir) return false if @disabled.include?(id) announced?(plugin_dir) ? true : @enabled.include?(id) end |
#load_all ⇒ Object
-> { skill_dirs: [], prompt_dirs: [], plugins: [Discovered] }
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/insika/plugin/loader.rb', line 35 def load_all seen = {} skill_dirs = [] prompt_dirs = [] plugins = [] manifest_files.each do |file| manifest = load_manifest(file) next if manifest.nil? id = manifest["id"].to_s next if id.empty? || !enabled?(id, File.dirname(file)) || seen.key?(id) config = validate_config(manifest, id) next if config == :skip discovered = build_discovered(manifest, File.dirname(file), config) next unless load_entry(manifest, discovered) skill_dirs.concat(discovered.skill_dirs) prompt_dirs.concat(discovered.prompt_dirs) plugins << discovered seen[id] = discovered emit_loaded(discovered) end { skill_dirs: skill_dirs, prompt_dirs: prompt_dirs, plugins: plugins } end |