Skip to content
Open
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 @@ -53,6 +53,7 @@ The current `golemcore/*` modules in this repository are:
| `golemcore/tavily-search` | Tavily-backed web search tool plugin with configurable search depth and answer generation. |
| `golemcore/telegram` | Telegram channel, invite onboarding, confirmations, and plan approval integration. |
| `golemcore/slack` | Slack Socket Mode channel plugin with thread follow-ups, confirmations, and plan approval UI. |
| `golemcore/supabase` | Supabase PostgREST rows plugin with configurable read/write operations for database tables. |
| `golemcore/weather` | Open-Meteo weather tool plugin with no external credentials required. |
| `golemcore/whisper` | Whisper-compatible speech-to-text provider plugin. |

Expand Down
12 changes: 12 additions & 0 deletions golemcore/supabase/plugin.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
id: golemcore/supabase
provider: golemcore
name: supabase
version: 1.0.0
pluginApiVersion: 1
engineVersion: ">=0.0.0 <1.0.0"
entrypoint: me.golemcore.plugins.golemcore.supabase.SupabasePluginBootstrap
description: Supabase PostgREST rows plugin backed by the Supabase REST API.
sourceUrl: https://github.com/alexk-dev/golemcore-plugins/tree/main/golemcore/supabase
license: Apache-2.0
maintainers:
- alexk-dev
104 changes: 104 additions & 0 deletions golemcore/supabase/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-supabase-plugin</artifactId>
<name>golemcore/supabase</name>
<description>Supabase PostgREST rows plugin for GolemCore</description>

<properties>
<plugin.owner>golemcore</plugin.owner>
<plugin.name>supabase</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.supabase;

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

public class SupabasePluginBootstrap implements PluginBootstrap {

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

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

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

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

static final String DEFAULT_SCHEMA = "public";
static final String DEFAULT_SELECT = "*";
static final int DEFAULT_LIMIT = 20;
static final int MAX_LIMIT = 1000;

@Builder.Default
private Boolean enabled = false;

private String projectUrl;
private String apiKey;

@Builder.Default
private String defaultSchema = DEFAULT_SCHEMA;

@Builder.Default
private String defaultTable = "";

@Builder.Default
private String defaultSelect = DEFAULT_SELECT;

@Builder.Default
private Integer defaultLimit = DEFAULT_LIMIT;

@Builder.Default
private Boolean allowWrite = false;

@Builder.Default
private Boolean allowDelete = false;

public void normalize() {
if (enabled == null) {
enabled = false;
}
projectUrl = normalizeUrl(projectUrl, null);
apiKey = normalizeText(apiKey, null);
defaultSchema = normalizeText(defaultSchema, DEFAULT_SCHEMA);
defaultTable = normalizeText(defaultTable, "");
defaultSelect = normalizeText(defaultSelect, DEFAULT_SELECT);
if (defaultLimit == null || defaultLimit <= 0) {
defaultLimit = DEFAULT_LIMIT;
}
if (defaultLimit > MAX_LIMIT) {
defaultLimit = MAX_LIMIT;
}
if (allowWrite == null) {
allowWrite = false;
}
if (allowDelete == null) {
allowDelete = false;
}
}

private String normalizeUrl(String value, String defaultValue) {
String trimmed = normalizeText(value, defaultValue);
if (trimmed == null) {
return null;
}
while (trimmed.endsWith("/")) {
trimmed = trimmed.substring(0, trimmed.length() - 1);
}
return trimmed.isBlank() ? defaultValue : trimmed;
}

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

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 SupabasePluginConfigService {

static final String PLUGIN_ID = "golemcore/supabase";

private final PluginConfigurationService pluginConfigurationService;
private final ObjectMapper objectMapper;

public SupabasePluginConfigService(PluginConfigurationService pluginConfigurationService) {
this.pluginConfigurationService = pluginConfigurationService;
this.objectMapper = new ObjectMapper();
}

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

@SuppressWarnings("unchecked")
public void save(SupabasePluginConfig config) {
config.normalize();
pluginConfigurationService.savePluginConfig(PLUGIN_ID, objectMapper.convertValue(config, Map.class));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package me.golemcore.plugins.golemcore.supabase;

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

@Configuration(proxyBeanMethods = false)
@ComponentScan(basePackageClasses = {
SupabaseRowsToolProvider.class,
SupabasePluginSettingsContributor.class
})
public class SupabasePluginConfiguration {
}
Loading
Loading