Releases
The current release line was published on 22 October 2026; the template package was updated on the same day.
| Component | Version | Distribution |
|---|---|---|
| PluginAbstractions | 1.1.0 | NuGet |
| PluginManager | v1.1.0 | lip, NuGet |
| HostingShim | v1.1.0 | lip, four carrier variants |
| C# Loader | v1.0.0 | lip |
| F# Loader | v1.0.0 | lip |
| RPC Loader | v1.0.0 | lip |
| Plugin.Build | 1.0.0 | NuGet |
| Testing | 1.0.0 | NuGet |
| Plugin templates | 1.0.1 | dotnet new |
Plugin template 1.0.1
Section titled “Plugin template 1.0.1”- The package adds a precompiled F# template,
hosihikari-plugin-fsharp; the C# template keepshosihikari-plugin. - Its content directories are
Hosihikari.Plugin.TemplatesandHosihikari.Plugin.Templates.FSharp. - A generated F# plugin package carries
FSharp.Core.dll; both templates keep the shared contract DLL out of the package.
The 1.1.0 line adds to the 1.0 API; existing plugins keep working without changes.
Hosihikari.Plugin.Abstractions1.1.0 adds the optionalIPluginLoaderDiagnosticscompanion interface. A loader that implements it validates a package beforeLoad; the reported problems skip that plugin and appear in the load report.Hosihikari.PluginManager1.1.0 addsPluginManagerOptions.UnloadVerificationTimeout(30 seconds by default) and thePlugins/TryGetPluginstatus snapshot. A verification timeout is recorded as a failed unload; the slot staysDetached, so the plugin is not reported as gone.HostingShimv1.1.0 depends on the1.1.*PluginManager line. Loaders remain on v1.0.0 and work with the new core.Hosihikari.Plugin.Build1.0.0 provides thePackPluginMSBuild target, so packing a plugin no longer needs a PluginManager checkout. Multi-target projects pass-f <tfm>.Hosihikari.Testing1.0.0 providesPluginTestHostfor lifecycle tests,PluginManagerHarnessfor the real manager, and in-memory services, events, and scheduling.
v1.0.0
Section titled “v1.0.0”- All components are released as v1.0.0. Public names follow ADR-0040:
PluginManager,IPluginLoaderwithId,PluginHandle,CarrierServices,RegisterLoader, andScheduleOnce/SchedulePeriodic. - Manifest fields are now
extraInfo.api_version,extraInfo.loader, andextraInfo.manifest_version; the oldapi,provider, andformat_versionkeys are rejected with a migration error. The top-leveltype,entry, andversionfields keep their wire names. - The GitHub repositories are renamed to HostingShim, PluginManager, PluginAbstractions, CSharpLoader, FSharpLoader, and RpcLoader; the NuGet packages are
Hosihikari.Plugin.AbstractionsandHosihikari.Plugin.Templates. - Unload verification runs outside the manager gate and shares an in-flight verification task across concurrent unloads.
- The RPC bindings use
scheduleOnce/schedulePeriodic(schedule_once/schedule_periodicin Python); the packer subcommand ispack-loader. - HostingShim and PluginManager are released together; HostingShim depends on the
1.0.*PluginManager line, and the hosting contract version stays 1.
Core v0.7.2
Section titled “Core v0.7.2”- Dependency versions are enforced. The plugin's own
versionis SemVer; a dependencyversionis a NuGet range such as1.2.3,[1.2.3], or[1.0.0,2.0.0). - Invalid versions or ranges are rejected when the manifest is read and when a package is packed. The dependency graph and parent-delivered loads check the target version before loading; an unsatisfied dependent is skipped with the constraint and actual version in the report.
- The
hosihikaridependency is not version-checked; the contract API and manifest format cover that compatibility. - The managed core is now its own lip package. It installs under
plugins/hosihikari/; the native Shim declares a compatible Core version as a lip dependency. - The native and managed sides check
HostingContractVersionat startup. A missing entry fails with -2, a mismatch with -3. - Explicitly unloading a provider package is refused; a manifest that cannot be read is isolated to its package.
- The failure-removal callback and core shutdown now use the same gate, and the provider-reuse log is written outside the core lock.
- The packer expands
#:includeglobs from the package root, so quoted paths and../shared/*.cswork. C# Provider 0.2.2 uses the same path handling when it loads the sources. - The packer tolerates read-only files when it cleans its staging directory; a cleanup failure no longer fails an already finished pack or provider pack.
- Floating constraints such as
1.*and1.2.*enforce their upper bound:1.*rejects2.0.0, and1.2.*rejects1.3.0. The dependency graph and parent-delivered loads share this check. - A null entry or empty name in
dependenciesis reported as a pack problem instead of throwing aNullReferenceException.
HostingShim v0.7.0
Section titled “HostingShim v0.7.0”- Release assets contain only native files: the carrier,
nethost, and the self-hosted launcher. Core files come from the Core package. - The Core dependency range is
0.7.*; hosting contract version stays 1. lip installresolves and installs Core automatically;verify-lipcovers the sharedplugins/hosihikari/layout.- Endstone uses
#endstoneon both Windows and Linux;platformselects the archive. The old#endstone_linuxlabel is removed. - Carrier reload keeps the managed core and loaded providers; only child plugins unload and reload (ADR-0037).
- Endstone reload waits for in-flight log lines before the old logger is destroyed; hostfxr is loaded once per process.
- Manifest and load-path hardening covers
nulland self dependencies, path-like names, loading-window rollback, and report delivery outside the load lock. - Smoke tests record the server's real exit code; Linux links the carrier with
-z nodelete.
C# Provider v0.2.3
Section titled “C# Provider v0.2.3”- The lip variant is platform-neutral and installs on Windows and Linux.
- Source files can use
#:package Id@Versionand#:includewith globs. #:includeaccepts quoted paths and../shared/*.cs, matching the packer's path handling.- Cache validation covers both the assembly and its PDB; compilation uses the same source snapshot as the cache key.
- Cache cleanup is safe across processes: old directories need an expired retention window and no active lease; staging and freshly published artifacts are left alone.
- A failed load releases its ALC, and a package must expose exactly one
IPlugintype. - A second provider package for the same plugin type now fails to load instead of remaining idle.
F# Provider v0.1.5
Section titled “F# Provider v0.1.5”- The lip variant is platform-neutral and installs on Windows and Linux.
- Compile-time references use the same package-first order as runtime resolution.
- FSharp.Compiler.Service compilation is limited to 30 seconds.
- PDB checksums, the source snapshot, and a unique staging directory protect the cache.
#loadand local#rfiles participate in the content-addressed key; an edit changes the directory, while an unchanged directive entry reuses the cached artifact.#I,nuget:, globs or unresolved paths still compile into a unique-run-<nonce>directory on every load.- Directive scanning follows F# lexing: line and nested block comments, strings inside comments, quoted identifiers, character literals and the
(*)operator are not mistaken for directives. An entry that ends inside a comment or string is treated as uncacheable. - Cross-process cleanup uses retention windows and load leases; a second provider package for the same type fails to load.
RPC Provider v0.2.4
Section titled “RPC Provider v0.2.4”- The Node binding ships
hosihikari.d.ts, the Python binding shipshosihikari.pyi, and the QuickJS binding documentsContextandPluginwith JSDoc; the templates carry the same declarations. - Node and QuickJS host requests time out after 30 seconds: the pending entry is removed and the promise rejects, and a reply clears the timer.
- A JSON line whose root is not an object (an array, a string, or
null) is dropped with a warning instead of ending the read loop. - The lip variant is platform-neutral and installs on Windows and Linux.
- Parent exit is detected through the process
Exitedevent, so an orphaned plugin shuts down. - Queues are bounded: 4096 incoming messages, 1024 replies, and 4 MiB per line; overflow reports a fault and stops the child.
- Lines are read in chunks with the 4 MiB limit enforced during reading, before a full line is allocated.
- Notifications are processed in order; during synchronous delivery only requests with an
idmay reenter, so notifications keep their wire order. - String request IDs are preserved, structured payloads keep their raw JSON, and a duplicate subscription can upgrade a topic to synchronous delivery.
- A second provider package for the same type fails to load.
Plugin template 0.1.2
Section titled “Plugin template 0.1.2”- The generated project references Abstractions 0.7.1 with
ExcludeAssets="runtime". - The scaffolding is MIT-0; the contract it references is MIT.
Install
Section titled “Install”dotnet add package Hosihikari.Plugin.Abstractions --version 1.1.0dotnet add package Hosihikari.Plugin.Build --version 1.0.0dotnet add package Hosihikari.Testing --version 1.0.0dotnet new install Hosihikari.Plugin.Templates::1.0.1
lip install github.com/HosihikariFramework/HostingShimlip install github.com/HosihikariFramework/CSharpLoaderlip install github.com/HosihikariFramework/FSharpLoaderlip install github.com/HosihikariFramework/RpcLoaderThe HostingShim package installs PluginManager as a lip dependency. To pin PluginManager explicitly:
HostingShim variants for LeviLamina and Endstone are selected with #levilamina and #endstone; the
package without a suffix installs the Linux self-hosted carrier. The loaders stay on v1.0.0 and
install alongside the 1.1.0 core.
Compatibility
Section titled “Compatibility”PluginManager v1.1.0 and HostingShim v1.1.0 use hosting contract version 1, and HostingShim declares a 1.1.* dependency.
Plugins built against Hosihikari.Plugin.Abstractions 1.1.0 use API version 2 and manifest manifest_version 1, the same as 1.0.0.
The previous release line was PluginAbstractions 0.7.1, PluginManager v0.7.2, HostingShim v0.7.0, C# Loader v0.2.3, F# Loader v0.1.5, RPC Loader v0.2.4, and template 0.1.2.
