Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ The current `golemcore/*` modules in this repository are:
| Plugin | Purpose |
| --- | --- |
| `golemcore/brave-search` | Brave Search web search tool plugin with API-key backed queries. |
| `golemcore/brain` | GolemCore Brain wiki tool plugin for CRUD operations and optional dynamic relevance search. |
| `golemcore/browser` | Playwright-backed browser automation tool with screenshot support. |
| `golemcore/browserless` | Browserless smart scrape plugin for rendered HTML, markdown, and link extraction. |
| `golemcore/elevenlabs` | ElevenLabs-backed STT/TTS provider plugin. |
Expand Down
12 changes: 12 additions & 0 deletions golemcore/brain/plugin.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
id: golemcore/brain
provider: golemcore
name: brain
version: 1.0.0
pluginApiVersion: 1
engineVersion: ">=0.0.0 <1.0.0"
entrypoint: me.golemcore.plugins.golemcore.brain.BrainPluginBootstrap
description: "GolemCore Brain wiki plugin for CRUD operations and optional dynamic relevance search."
sourceUrl: "https://github.com/alexk-dev/golemcore-plugins/tree/main/golemcore/brain"
license: "Apache-2.0"
maintainers:
- alexk-dev
104 changes: 104 additions & 0 deletions golemcore/brain/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>me.golemcore.plugins</groupId>
<artifactId>golemcore-plugins</artifactId>
<version>1.0.0</version>
<relativePath>../../pom.xml</relativePath>
</parent>

<version>1.0.0</version>
<artifactId>golemcore-brain-plugin</artifactId>
<name>golemcore/brain</name>
<description>GolemCore Brain wiki tool plugin for GolemCore</description>

<properties>
<plugin.owner>golemcore</plugin.owner>
<plugin.name>brain</plugin.name>
<formatter.config.file>../../misc/formatter_eclipse.xml</formatter.config.file>
</properties>

<dependencies>
<dependency>
<groupId>me.golemcore.plugins</groupId>
<artifactId>golemcore-plugin-extension-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>me.golemcore.plugins</groupId>
<artifactId>golemcore-plugin-runtime-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp-jvm</artifactId>
<version>${okhttp.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>${project.basedir}</directory>
<includes>
<include>plugin.yaml</include>
</includes>
<targetPath>META-INF/golemcore</targetPath>
</resource>
</resources>
<plugins>
<plugin>
<groupId>net.revelc.code.formatter</groupId>
<artifactId>formatter-maven-plugin</artifactId>
</plugin>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
</plugin>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>copy-plugin-artifact</id>
<phase>package</phase>
<configuration>
<target>
<mkdir dir="${project.basedir}/../../dist/${plugin.owner}/${plugin.name}/${project.version}" />
<copy file="${project.build.directory}/${project.build.finalName}.jar"
tofile="${project.basedir}/../../dist/${plugin.owner}/${plugin.name}/${project.version}/${project.artifactId}-${project.version}.jar"
overwrite="true" />
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package me.golemcore.plugins.golemcore.brain;

import me.golemcore.plugin.api.extension.spi.PluginBootstrap;
import me.golemcore.plugin.api.extension.spi.PluginDescriptor;

public class BrainPluginBootstrap implements PluginBootstrap {

@Override
public PluginDescriptor descriptor() {
return PluginDescriptor.builder()
.id("golemcore/brain")
.provider("golemcore")
.name("brain")
.entrypoint(getClass().getName())
.build();
}

@Override
public Class<?> configurationClass() {
return BrainPluginConfiguration.class;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package me.golemcore.plugins.golemcore.brain;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class BrainPluginConfig {

private static final int DEFAULT_INTELLISEARCH_LIMIT = 5;
private static final int MAX_INTELLISEARCH_LIMIT = 20;

@Builder.Default
private Boolean enabled = false;

private String baseUrl;
private String apiToken;

@Builder.Default
private String defaultSpaceSlug = "default";

private String dynamicApiSlug;

@Builder.Default
private Integer defaultIntellisearchLimit = DEFAULT_INTELLISEARCH_LIMIT;

@Builder.Default
private Boolean allowWrite = false;

public void normalize() {
if (enabled == null) {
enabled = false;
}
baseUrl = trimToNull(baseUrl);
if (baseUrl != null) {
baseUrl = stripTrailingSlash(baseUrl);
}
apiToken = trimToNull(apiToken);
defaultSpaceSlug = normalizeDefaultSpace(defaultSpaceSlug);
dynamicApiSlug = trimToNull(dynamicApiSlug);
if (defaultIntellisearchLimit == null || defaultIntellisearchLimit <= 0) {
defaultIntellisearchLimit = DEFAULT_INTELLISEARCH_LIMIT;
}
if (defaultIntellisearchLimit > MAX_INTELLISEARCH_LIMIT) {
defaultIntellisearchLimit = MAX_INTELLISEARCH_LIMIT;
}
if (allowWrite == null) {
allowWrite = false;
}
}

private String normalizeDefaultSpace(String value) {
String normalized = trimToNull(value);
return normalized != null ? normalized : "default";
}

private String stripTrailingSlash(String value) {
String stripped = value;
while (stripped.endsWith("/")) {
stripped = stripped.substring(0, stripped.length() - 1);
}
return stripped;
}

private String trimToNull(String value) {
if (value == null) {
return null;
}
String trimmed = value.trim();
return trimmed.isEmpty() ? null : trimmed;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package me.golemcore.plugins.golemcore.brain;

import org.springframework.beans.factory.annotation.Autowired;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import me.golemcore.plugin.api.runtime.PluginConfigurationService;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
public class BrainPluginConfigService {

static final String PLUGIN_ID = "golemcore/brain";

private final PluginConfigurationService pluginConfigurationService;
private final ObjectMapper objectMapper;

@Autowired
public BrainPluginConfigService(PluginConfigurationService pluginConfigurationService) {
this.pluginConfigurationService = pluginConfigurationService;
this.objectMapper = new ObjectMapper();
}

public BrainPluginConfig getConfig() {
Map<String, Object> raw = pluginConfigurationService == null
? Map.of()
: pluginConfigurationService.getPluginConfig(PLUGIN_ID);
BrainPluginConfig config = raw.isEmpty()
? BrainPluginConfig.builder().build()
: objectMapper.convertValue(raw, BrainPluginConfig.class);
config.normalize();
return config;
}

public void save(BrainPluginConfig config) {
config.normalize();
Map<String, Object> saved = objectMapper.convertValue(config, new TypeReference<>() {
});
pluginConfigurationService.savePluginConfig(PLUGIN_ID, saved);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package me.golemcore.plugins.golemcore.brain;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration(proxyBeanMethods = false)
@ComponentScan(basePackageClasses = {
BrainToolProvider.class,
BrainPluginSettingsContributor.class
})
public class BrainPluginConfiguration {
}
Loading
Loading