feat(plugin): scaffold RPCP plugin loading core

- Add JarFile-based plugin.json manifest reading and validation
- Implement reflection-based plugin class instantiation (Data or no-arg constructor)
- Wrap Tool objects into OllamaFunctionTool with basic parameter/response handling
- Implement ToolArguments storage and ToolResponse record
- Extract RPCP_SOURCE constant; add plugin name validation
- Update Data interface: getLoadedPlugins() returns LoadedPlugin[]
- Fix launcher package references (me.zacharias.chat → me.neurodock)

TODO: Extract FileSystem from JAR, populate PluginMetadata, complete
OllamaFunctionArgument↔ToolArguments wrapping, invoke plugin lifecycle hooks

Signed-off-by: zacharias <alienfromdia@proton.me>
This commit is contained in:
2026-06-15 22:09:55 +02:00
parent d016ad9a48
commit b74c5e9e97
12 changed files with 244 additions and 51 deletions
@@ -6,6 +6,11 @@ import org.jetbrains.annotations.NotNull;
import org.json.JSONObject;
public abstract class Tool {
/**
* Magic constant for RPCP sources.<br>
* This is solely here to replace the case of a magic string being used in the code
*/
public static final String RPCP_SOURCE = "RPCP";
/**
* The parent plugin of this tool, used by {@link Tool#getToolJSON()}.
@@ -29,7 +34,7 @@ public abstract class Tool {
ret.put("type", "function");
JSONObject function = new JSONObject();
function.put("name", String.format("%s_%s_RPCP", name(), PLUGIN.getMetadata().getName()).replaceAll(" ", "_"));
function.put("name", String.format("%s_%s_%s", name(), PLUGIN.getMetadata().getName(), RPCP_SOURCE).replaceAll(" ", "_"));
if(description() != null) {
function.put("description", description());
}