{"url":"https://levimc.org/mods/github.com/HosihikariFramework/RpcProvider/","id":"github.com/HosihikariFramework/RpcProvider","name":"星光 · 进程外 Provider","description":"星光框架的进程外插件 Provider：行分隔 JSON-RPC 2.0，附带 Node/QuickJS/Python/Java/Kotlin 绑定","owner":"HosihikariFramework","logo":"https://levimc.org/mods/icons/cbac7989ff2c456c-288.webp","repository":"https://github.com/HosihikariFramework/RpcLoader","issues":"https://github.com/HosihikariFramework/RpcLoader/issues","releases":"https://github.com/HosihikariFramework/RpcLoader/releases","stars":0,"downloads":99,"updated":"2026-11-09T10:49:08Z","published":"2026-10-19T04:41:07Z","created":"2026-10-17T07:34:27Z","license":"LGPL-3.0","side":["server","client"],"platform":["android-arm64","linux-arm64","linux-x64","win-arm64","win-x64"],"gameVersions":[],"tags":["platform:levilamina","platform:endstone","type:mod"],"latest":{"variant":"","version":"0.2.4","install":"lip install github.com/HosihikariFramework/RpcProvider@0.2.4"},"readmes":[{"file":"README.md","lang":"en","text":"# Hosihikari.PluginProvider.Rpc\n\n[English](README.md) | [简体中文](README.zh_hans.md)\n\n> **Exception first-class provider.** RpcProvider is an official provider: the one exception to the source-AOT-to-IL rule (ADR-0031). Use it when a plugin cannot be compiled to IL.\n\nThe **exception first-class cross-process bridge** of the Hosihikari framework. Plugins run as child processes\nand speak newline-delimited JSON-RPC 2.0 over stdio; the bridge reads only the command in the\nmanifest and the protocol. Unload means the process really exits.\n\n**It is a plugin package itself**, named `hosihikari-rpc`. When it loads, it registers itself with\nthe framework from `OnLoad`; packages with `provider: \"rpc\"` are only handled after that — which is\nwhy bridge plugins declare a dependency on it.\n\n## Templates\n\n[RpcPluginTemplate](https://github.com/HosihikariFramework/RpcPluginTemplate) carries complete\npackages for three runtimes:\n\n- [Node.js/TypeScript runtime](https://github.com/HosihikariFramework/RpcPluginTemplate/tree/main/node-typescript)\n- [Python runtime](https://github.com/HosihikariFramework/RpcPluginTemplate/tree/main/python)\n- [Kotlin/JVM runtime](https://github.com/HosihikariFramework/RpcPluginTemplate/tree/main/kotlin)\n\n## What a plugin package looks like\n\n```\nplugins/Hello/\n  manifest.json\n    {\n      \"name\": \"Hello\",\n      \"entry\": \"main.mjs\",\n      \"type\": \"hosihikari\",\n      \"version\": \"1.0.0\",\n      \"dependencies\": [\n        { \"name\": \"hosihikari\" },\n        { \"name\": \"hosihikari-rpc\" }\n      ],\n      \"extraInfo\": {\n        \"api\": \"2\",\n        \"format_version\": \"1\",\n        \"provider\": \"rpc\",\n        \"command\": \"[\\\"node\\\", \\\"./hosihikari.mjs\\\", \\\"./main.mjs\\\"]\"\n      }\n    }\n  hosihikari.mjs     ← the binding, copied from bindings/node in this repository\n  main.mjs\n  Hello.conf\n```\n\n`extraInfo.command` is a non-empty JSON array encoded as a string — the parent's manifest parser\nrequires `extraInfo` values to be strings. The Provider decodes it and passes the items into the\nargument list one by one; there is no shell, and the working directory is the package directory. The\nruntime executable is supplied by the operator (PATH or an absolute path). Under Endstone, the CLI\nsets the child's PATH to Python's `sys.path`, so name the runtime by absolute path there.\n\n## How a plugin is written\n\nThe binding connects a default-exported object to the protocol. Hooks may be async; `undefined` /\n`true` allow, `false` or `{ allowed: false, reason }` refuse, and a thrown exception is a fault.\n\n```js\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport default {\n  onLoad(ctx) {\n    fs.writeFileSync(path.join(ctx.dataDirectory, 'body.txt'), 'body:' + ctx.config('greeting'));\n    ctx.subscribe('ping', (json) => ctx.logInfo('ping:' + json));\n  },\n  onEnable(ctx) { },\n  onDisable(ctx) { return { allowed: false, reason: 'not yet' }; },\n  onUnload(ctx) { },\n};\n```\n\n`ctx` exposes `name`, `dataDirectory`, `packageDirectory`, `config(key)`, `configObject`,\n`logInfo/logWarn/logError`, `writeData`, `publish`, `subscribe(topic, fn, { sync })`, and\n`runLater/runEvery`.\n\n## Protocol\n\n- **Handshake**: the host sends `hosihikari/hello` with the protocol version, name, data directory,\n  package directory and a configuration snapshot; the binding calls `onLoad(ctx)` before replying.\n- **Host to plugin**: `hosihikari/enable`, `disable`, `unload`, `events/deliver`.\n- **Plugin to host**: `hosihikari/events/publish`, `subscribe`, `unsubscribe`, `log`.\n- **Events**: asynchronous by default (the host sends a notification and the publisher does not\n  wait); a subscription can declare `sync: true`, in which case the host waits for the ack and\n  treats a timeout as a fault.\n- **Deadlines**: waiting for the write gate, writing, and waiting for the response share one timeout.\n  A timeout terminates the child to release blocked pipe writes; notifications and replies have a\n  five-second write timeout. Subscription changes follow their receive order.\n- **Logging**: stdout carries protocol only; stderr is text logging; structured levels go through\n  `hosihikari/log`.\n- **Unload**: send `unload`, close stdin, wait 5 seconds, then kill the process tree. The release\n  verifier checks that the process has exited.\n\n## Capability surface\n\nThe child process's standard library plus host services. There is no arbitrary .NET interop; the\ntype-keyed service registry does not cross the process boundary (there are no shared types). The\ndata directory is read and written directly; timers belong to the child process.\n\n## Running it\n\n```\ndotnet run --project host/Hosihikari.PluginProvider.Rpc.Host.csproj -c Release\n```\n\nIt needs sibling `Hosihikari.PluginManager`, `Hosihikari.Abstractions` and McMaster fork checkouts,\nand Node, `qjs`, Python (`python3`; on Windows `python` or `py -3`), JDK 21 and `kotlinc` on PATH.\nIt covers: the Provider is registered by a plugin package; the Node, QuickJS, Python, Java and\nKotlin bindings each verify the hello snapshot with layered configuration, enable/disable/unload\nhooks, asynchronous events by default, the sync ack, timers and publishing back to the host; Java\nalso covers refused enable/disable and faulting out a process that dies outside a hook, and Kotlin\nverifies the same JVM binding from Kotlin.\n\n## Bindings\n\n`bindings/node`, `bindings/quickjs`, `bindings/python` and `bindings/java` hold the reference\nbindings, each with test fixtures; `bindings/kotlin` holds the Kotlin fixture for the JVM binding.\n\nThe QuickJS binding needs `qjs` (quickjs-ng) on PATH or carried in the package; copy\n`hosihikari.js` and `stdin_worker.js` next to the entry and point the command at it:\n\n```json\n\"command\": \"[\\\"qjs\\\", \\\"./hosihikari.js\\\", \\\"./main.js\\\"]\"\n```\n\nIts `ctx` writes through `ctx.writeData`; files and timers come from the child process's standard\nlibrary (`qjs:std` / `qjs:os`), and `print` / `console` go to stderr.\n\nThe Python binding copies `hosihikari.py` next to the entry; the plugin defines module-level\n`on_load(ctx)` / `on_enable(ctx)` / `on_disable(ctx)` / `on_unload(ctx)`:\n\n```json\n\"command\": \"[\\\"python3\\\", \\\"./hosihikari.py\\\", \\\"./main.py\\\"]\"\n```\n\n`ctx` provides `name`, `data_directory`, `package_directory`, `config(key)`, `config_object`,\n`log_info/log_warn/log_error`, `write_data(file, text)`, `publish(topic, json)`,\n`subscribe(topic, fn, sync=False)`, `run_later(seconds, fn)` and `run_every(seconds, fn)`.\n`print` goes to stderr; stdout is protocol only.\n\nThe JVM binding lives in `bindings/java/hosihikari` and serves Java and Kotlin plugins. A plugin\nimplements `hosihikari.Plugin` (`onLoad` / `onEnable` / `onDisable` / `onUnload`); hooks return\n`HookResult.allow()` / `HookResult.refuse(reason)`. `Context` provides `name()`, `dataDirectory()`,\n`packageDirectory()`, `config(key)`, `configObject()`, `logInfo/logWarn/logError`,\n`writeData(file, text)`, `publish(topic, json)`, `subscribe(topic, Consumer<String>[, sync])`,\n`runLater(millis, Runnable)` and `runEvery(millis, Runnable)`. Compile the Java plugin together\nwith the binding:\n\n```json\n\"command\": \"[\\\"java\\\", \\\"-cp\\\", \\\"./classes\\\", \\\"hosihikari.Binding\\\", \\\"hello.HelloPlugin\\\"]\"\n```\n\nA Kotlin plugin implements the same interface; compile it against the binding classes and bundle\nthe Kotlin stdlib (`-include-runtime`). The runtime classpath separator is `:` on Unix and `;` on\nWindows:\n\n```json\n\"command\": \"[\\\"java\\\", \\\"-cp\\\", \\\"./plugin.jar:./classes\\\", \\\"hosihikari.Binding\\\", \\\"hello.HelloPlugin\\\"]\"\n```\n\nThe JVM binding needs JDK 21; Kotlin plugins additionally need `kotlinc` at build time, while the\nruntime only needs `java` and the packaged jar. Other languages follow on demand; the protocol\ndoes not change.\n\nThe process supervision and subscription ordering regressions can also run without Node, QuickJS,\nPython, a JDK or Kotlin:\n\n```\ndotnet run --project test/Hosihikari.PluginProvider.Rpc.Regression.csproj -c Release\n```\n\nThis check links the production connection source and sibling Abstractions source. It covers blocked\nwrites, shared request deadlines, concurrent disposal, notification timeouts, subscription ordering,\nand reentrant synchronous event publication. CI runs it alongside the binding assertions.\n\n## Packaging\n\n```\npwsh ./pack.ps1 -Version 0.2.4 -OutputRoot artifacts\n```\n\nIt assembles the provider DLL, its private dependencies, the manifest and `bindings/` into\n`hosihikari-rpc/`; the shared layer is not copied. Pushing a `v*` tag attaches the zip to the\nGitHub release (ADR-0036).\n\nThe script invokes the core packager (`Hosihikari.PluginManager/tools/Pack`), which owns the\nshared-layer list. Check out the core repository alongside this one, or set\n`HOSIHIKARI_PLUGINMANAGER`.\n\nAfter release: `lip install github.com/HosihikariFramework/RpcProvider` (install the Shim variant\nfor the carrier first).\n\n## Licence\n\nLGPL-3.0-or-later, see [LICENSE.md](LICENSE.md).\n"},{"file":"README.zh_hans.md","lang":"zh-Hans","text":"# Hosihikari.PluginProvider.Rpc\n\n[English](README.md) | [简体中文](README.zh_hans.md)\n\n> **例外一等 Provider。** RpcProvider 是官方 Provider，也是源码 AOT 为 IL 规则的唯一例外（ADR-0031）；插件无法编译为 IL 时才用它。\n\n星光框架的**例外一等跨进程桥**。插件以子进程运行，协议是行分隔的 JSON-RPC 2.0\nover stdio；它只认清单里的命令与协议。卸载就是让进程真正退出。\n\n**它自己也是一个插件包**：`hosihikari-rpc`。装载时在 `OnLoad` 里把自己登记给框架，此后\n`provider: \"rpc\"` 的包才会被它接管 —— 所以进程外插件要在清单里声明依赖它。\n\n## 模板\n\n[RpcPluginTemplate](https://github.com/HosihikariFramework/RpcPluginTemplate) 提供三个运行时的完整\n插件包：\n\n- [Node.js/TypeScript 运行时](https://github.com/HosihikariFramework/RpcPluginTemplate/tree/main/node-typescript)\n- [Python 运行时](https://github.com/HosihikariFramework/RpcPluginTemplate/tree/main/python)\n- [Kotlin/JVM 运行时](https://github.com/HosihikariFramework/RpcPluginTemplate/tree/main/kotlin)\n\n## 插件包长什么样\n\n```\nplugins/Hello/\n  manifest.json\n    {\n      \"name\": \"Hello\",\n      \"entry\": \"main.mjs\",\n      \"type\": \"hosihikari\",\n      \"version\": \"1.0.0\",\n      \"dependencies\": [\n        { \"name\": \"hosihikari\" },\n        { \"name\": \"hosihikari-rpc\" }\n      ],\n      \"extraInfo\": {\n        \"api\": \"2\",\n        \"format_version\": \"1\",\n        \"provider\": \"rpc\",\n        \"command\": \"[\\\"node\\\", \\\"./hosihikari.mjs\\\", \\\"./main.mjs\\\"]\"\n      }\n    }\n  hosihikari.mjs     ← 绑定，从本仓 bindings/node 拷来\n  main.mjs\n  Hello.conf\n```\n\n`extraInfo.command` 是**编码成字符串的 JSON 数组**——父级的清单解析要求 `extraInfo` 的值是字符串。\nProvider 解码后把各项逐个放进参数表；不经 shell，工作目录是包目录。子进程的可执行文件由运维提供\n（PATH 或绝对路径）。在 Endstone 下，CLI 会把子进程的 PATH 换成 Python 的 `sys.path`，可执行文件要写绝对路径。\n\n## 插件怎么写\n\n绑定把默认导出的对象接到协议上。钩子可以 async；`undefined` / `true` 允许，`false` 或\n`{ allowed: false, reason }` 拒绝，抛异常是故障。\n\n```js\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport default {\n  onLoad(ctx) {\n    fs.writeFileSync(path.join(ctx.dataDirectory, 'body.txt'), 'body:' + ctx.config('greeting'));\n    ctx.subscribe('ping', (json) => ctx.logInfo('ping:' + json));\n  },\n  onEnable(ctx) { },\n  onDisable(ctx) { return { allowed: false, reason: '还不想停' }; },\n  onUnload(ctx) { },\n};\n```\n\n`ctx` 提供 `name`、`dataDirectory`、`packageDirectory`、`config(key)`、`configObject`、\n`logInfo/logWarn/logError`、`writeData`、`publish`、`subscribe(topic, fn, { sync })`、\n`runLater/runEvery`。\n\n## 协议\n\n- **握手**：宿主发 `hosihikari/hello`，带协议版本、名字、数据目录、包目录与配置快照；绑定在返回前\n  调用 `onLoad(ctx)`。\n- **宿主→插件**：`hosihikari/enable` / `disable` / `unload` / `events/deliver`。\n- **插件→宿主**：`hosihikari/events/publish` / `subscribe` / `unsubscribe` / `log`。\n- **事件**：默认异步（宿主发通知，发布方不等）；订阅声明 `sync: true` 时宿主等 ack，超时即故障。\n- **超时**：等待写锁、写入与等待响应共用同一个截止时间；超时终止子进程以解除管道阻塞。\n  通知与回复的写入限时五秒，订阅变更按收到的顺序处理。\n- **日志**：stdout 只走协议；stderr 是文本日志；结构化级别走 `hosihikari/log`。\n- **卸载**：`unload` 请求 → 关 stdin → 等 5 秒 → 杀进程树；验证器看进程是否退出。\n\n## 能力面\n\n子进程自带的标准库 + 宿主服务。没有任意 .NET 互操作；类型键的服务注册表不跨进程（没有共享类型）。\n数据目录由插件直接读写；定时器用语言自己的。\n\n## 跑一遍\n\n```\ndotnet run --project host/Hosihikari.PluginProvider.Rpc.Host.csproj -c Release\n```\n\n需要并列的 `Hosihikari.PluginManager`、`Hosihikari.Abstractions` 与 McMaster 的 fork checkout，以及 PATH 上的\nNode、`qjs`、Python（`python3`；Windows 上是 `python` 或 `py -3`）、JDK 21 与 `kotlinc`。它覆盖：\nProvider 由插件包登记；Node、QuickJS、Python、Java 与 Kotlin 绑定各自验证 hello 快照与配置分层、\n启用/停用/卸载、默认异步事件、同步 ack、定时器与插件→宿主发布；Java 还覆盖拒绝启用/停用与进程死亡\n故障卸载，Kotlin 验证同一份 JVM 绑定在 Kotlin 下的互操作。\n\n## 绑定\n\n`bindings/node`、`bindings/quickjs`、`bindings/python` 与 `bindings/java` 是参考绑定，各带测试夹具；\n`bindings/kotlin` 是 JVM 绑定的 Kotlin 夹具。\n\nQuickJS 这一份需要 PATH 上的 `qjs`（quickjs-ng），或随包携带；把 `hosihikari.js` 与 `stdin_worker.js`\n拷到入口旁边，命令指向它：\n\n```json\n\"command\": \"[\\\"qjs\\\", \\\"./hosihikari.js\\\", \\\"./main.js\\\"]\"\n```\n\n它的 `ctx` 通过 `ctx.writeData` 写文件；文件与定时器来自 QuickJS 自带标准库（`qjs:std` / `qjs:os`），\n`print` / `console` 走 stderr。\n\nPython 这一份把 `hosihikari.py` 拷到入口旁边；插件定义模块级的 `on_load(ctx)` /\n`on_enable(ctx)` / `on_disable(ctx)` / `on_unload(ctx)`：\n\n```json\n\"command\": \"[\\\"python3\\\", \\\"./hosihikari.py\\\", \\\"./main.py\\\"]\"\n```\n\n`ctx` 提供 `name`、`data_directory`、`package_directory`、`config(key)`、`config_object`、\n`log_info/log_warn/log_error`、`write_data(file, text)`、`publish(topic, json)`、\n`subscribe(topic, fn, sync=False)`、`run_later(seconds, fn)`、`run_every(seconds, fn)`。\n`print` 走 stderr，stdout 只留给协议。\n\nJVM 绑定在 `bindings/java/hosihikari`，Java 与 Kotlin 插件共用同一份。插件实现\n`hosihikari.Plugin`（`onLoad` / `onEnable` / `onDisable` / `onUnload`），钩子返回\n`HookResult.allow()` / `HookResult.refuse(reason)`；`Context` 提供 `name()`、`dataDirectory()`、\n`packageDirectory()`、`config(key)`、`configObject()`、`logInfo/logWarn/logError`、\n`writeData(file, text)`、`publish(topic, json)`、`subscribe(topic, Consumer<String>[, sync])`、\n`runLater(millis, Runnable)`、`runEvery(millis, Runnable)`。Java 插件与绑定一起编译：\n\n```json\n\"command\": \"[\\\"java\\\", \\\"-cp\\\", \\\"./classes\\\", \\\"hosihikari.Binding\\\", \\\"hello.HelloPlugin\\\"]\"\n```\n\nKotlin 插件实现同一接口，编译时把 Java 绑定类放进 classpath，并把 Kotlin 标准库打进 jar；\n运行时 classpath 分隔符在 Unix 是 `:`、Windows 是 `;`：\n\n```json\n\"command\": \"[\\\"java\\\", \\\"-cp\\\", \\\"./plugin.jar:./classes\\\", \\\"hosihikari.Binding\\\", \\\"hello.HelloPlugin\\\"]\"\n```\n\nJVM 绑定需要 JDK 21；Kotlin 插件另需构建期的 `kotlinc`，运行时只要有 `java` 与打好的 jar。\n其余语言按需补，协议不变。\n\n进程监督与订阅顺序回归不需要 Node、QuickJS、Python、JDK 或 Kotlin，也可以单独运行：\n\n```\ndotnet run --project test/Hosihikari.PluginProvider.Rpc.Regression.csproj -c Release\n```\n\n此检查直接编译生产连接源码及并列的 Abstractions 源码，覆盖阻塞写入、请求共用截止时间、\n并发释放、通知超时、订阅顺序，以及同步事件处理中的再次发布。CI 同时运行它与绑定断言。\n\n## 打包\n\n```\npwsh ./pack.ps1 -Version 0.2.4 -OutputRoot artifacts\n```\n\n它把 Provider DLL、私有依赖、清单与 `bindings/` 装进 `hosihikari-rpc/`，共享层不随包走；打 `v*` 标签时 CI 把 zip 附到 release（ADR-0036）。\n\n打包脚本调用核心打包器（`Hosihikari.PluginManager/tools/Pack`），共享层清单由核心统一给出；需要并列检出核心仓，或设置 `HOSIHIKARI_PLUGINMANAGER`。\n\n发布后：`lip install github.com/HosihikariFramework/RpcProvider`（先按载体装 Shim）。\n\n## 许可\n\nLGPL-3.0-or-later，见 [LICENSE.md](LICENSE.md)。\n"}],"gallery":[],"versions":[{"version":"0.2.4","prerelease":false,"released":"2026-10-21T03:56:36Z","releaseUrl":"https://github.com/HosihikariFramework/RpcLoader/releases/tag/v0.2.4","manifestUrl":"https://github.com/HosihikariFramework/RpcLoader/blob/v0.2.4/tooth.json","info":{"name":"星光 · 进程外 Provider","description":"星光框架的进程外插件 Provider：行分隔 JSON-RPC 2.0，附带 Node/QuickJS/Python/Java/Kotlin 绑定","tags":["platform:levilamina","platform:endstone","type:mod"]},"variants":{"":[{"side":"server","platform":"win-x64","deps":{}},{"side":"client","platform":"win-x64","deps":{}},{"side":"server","platform":"win-arm64","deps":{}},{"side":"client","platform":"win-arm64","deps":{}},{"side":"server","platform":"linux-x64","deps":{}},{"side":"client","platform":"linux-x64","deps":{}},{"side":"server","platform":"linux-arm64","deps":{}},{"side":"client","platform":"linux-arm64","deps":{}},{"side":"server","platform":"android-arm64","deps":{}},{"side":"client","platform":"android-arm64","deps":{}}]}},{"version":"0.2.3","prerelease":false,"released":"2026-10-21T03:07:28Z","releaseUrl":"https://github.com/HosihikariFramework/RpcLoader/releases/tag/v0.2.3","manifestUrl":"https://github.com/HosihikariFramework/RpcLoader/blob/v0.2.3/tooth.json","info":{"name":"星光 · 进程外 Provider","description":"星光框架的进程外插件 Provider：行分隔 JSON-RPC 2.0，附带 Node/QuickJS/Python/Java/Kotlin 绑定","tags":["platform:levilamina","platform:endstone","type:mod"]},"variants":{"":[{"side":"server","platform":"win-x64","deps":{}},{"side":"client","platform":"win-x64","deps":{}},{"side":"server","platform":"win-arm64","deps":{}},{"side":"client","platform":"win-arm64","deps":{}},{"side":"server","platform":"linux-x64","deps":{}},{"side":"client","platform":"linux-x64","deps":{}},{"side":"server","platform":"linux-arm64","deps":{}},{"side":"client","platform":"linux-arm64","deps":{}},{"side":"server","platform":"android-arm64","deps":{}},{"side":"client","platform":"android-arm64","deps":{}}]}},{"version":"0.2.2","prerelease":false,"released":"2026-10-21T02:16:44Z","releaseUrl":"https://github.com/HosihikariFramework/RpcLoader/releases/tag/v0.2.2","manifestUrl":"https://github.com/HosihikariFramework/RpcLoader/blob/v0.2.2/tooth.json","info":{"name":"星光 · 进程外 Provider","description":"星光框架的进程外插件 Provider：行分隔 JSON-RPC 2.0，附带 Node/QuickJS/Python/Java/Kotlin 绑定","tags":["platform:levilamina","platform:endstone","type:mod"]},"variants":{"":[{"side":"server","platform":"win-x64","deps":{}},{"side":"client","platform":"win-x64","deps":{}}]}},{"version":"0.2.1","prerelease":false,"released":"2026-10-20T09:44:11Z","releaseUrl":"https://github.com/HosihikariFramework/RpcLoader/releases/tag/v0.2.1","manifestUrl":"https://github.com/HosihikariFramework/RpcLoader/blob/v0.2.1/tooth.json","info":{"name":"星光 · 进程外 Provider","description":"星光框架的进程外插件 Provider：行分隔 JSON-RPC 2.0，附带 Node/QuickJS/Python/Java/Kotlin 绑定","tags":["platform:levilamina","platform:endstone","type:mod"]},"variants":{"":[{"side":"server","platform":"win-x64","deps":{}},{"side":"client","platform":"win-x64","deps":{}}]}},{"version":"0.2.0","prerelease":false,"released":"2026-10-20T08:02:19Z","releaseUrl":"https://github.com/HosihikariFramework/RpcLoader/releases/tag/v0.2.0","manifestUrl":"https://github.com/HosihikariFramework/RpcLoader/blob/v0.2.0/tooth.json","info":{"name":"星光 · 进程外 Provider","description":"星光框架的进程外插件 Provider：行分隔 JSON-RPC 2.0，附带 Node/QuickJS/Python/Java/Kotlin 绑定","tags":["platform:levilamina","platform:endstone","type:mod"]},"variants":{"":[{"side":"server","platform":"win-x64","deps":{}},{"side":"client","platform":"win-x64","deps":{}}]}},{"version":"0.1.0","prerelease":false,"released":"2026-10-19T04:41:07Z","releaseUrl":"https://github.com/HosihikariFramework/RpcLoader/releases/tag/v0.1.0","manifestUrl":"https://github.com/HosihikariFramework/RpcLoader/blob/v0.1.0/tooth.json","info":{"name":"星光 · 进程外 Provider","description":"星光框架的进程外插件 Provider：行分隔 JSON-RPC 2.0，附带 Node/QuickJS/Python/Java/Kotlin 绑定","tags":["platform:levilamina","platform:endstone","type:mod"]},"variants":{"":[{"side":"server","platform":"win-x64","deps":{}},{"side":"client","platform":"win-x64","deps":{}}]}}],"dependencies":{},"requiredBy":[]}