feat: add plugin system (#1034)

* feat: add plugin system

* fix db docker build

* fix hammerhead readme, add strava subscription news to docs

* fixes and sdk improvements

* fix: reduce Meilisearch load, debounce federation sync (#1012)

* optimize meili trail index

* several fixes

---------

Co-authored-by: Flomp <Flomp@users.noreply.github.com>

* Bump svelte from 5.55.5 to 5.56.0 in /docs (#1032)

Bumps [svelte](https://github.com/sveltejs/svelte/tree/HEAD/packages/svelte) from 5.55.5 to 5.56.0.
- [Release notes](https://github.com/sveltejs/svelte/releases)
- [Changelog](https://github.com/sveltejs/svelte/blob/main/packages/svelte/CHANGELOG.md)
- [Commits](https://github.com/sveltejs/svelte/commits/svelte@5.56.0/packages/svelte)

---
updated-dependencies:
- dependency-name: svelte
  dependency-version: 5.56.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Flomp <Flomp@users.noreply.github.com>

* Release v0.19.2 (#1035)

* chore: release v0.19.2

* add changelog

---------

Co-authored-by: Flomp <26000991+Flomp@users.noreply.github.com>
Co-authored-by: Christian Beutel <>

* speed up plugin sync and several small fixes

* concepts for security improvements and process stability

* improve concept

* security concept implemented

* remove insecure TLS

* worker concept implemented

* fixes and cleanup

* fixes

* docu

* mermaid, namings

* WASM plugin host improvements, plugin logging

* fix db migration

* Improve plugin config and category mapping UI

* fixes

* further fixes

* remove manual test sync

* fix db migration and strava mapping

* type added, UI improvements

* fix plugin card toggle clickable area

* optimize synch status card layout

* plugin type 'trails' instead of 'integration'

* session auth validation in UI

* fix komoot date and waypoints

* improve category mapping

* fix send to hammerhead: trail name

* plugin setup error handling improved

* fix review findings

* re-mapping added

* rename remote_category

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Flomp <Flomp@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Flomp <26000991+Flomp@users.noreply.github.com>
This commit is contained in:
slothful-vassal
2026-06-22 15:00:44 +02:00
committed by GitHub
parent 2e3d8537b8
commit 485ec53f6d
196 changed files with 20947 additions and 5454 deletions

View File

@@ -0,0 +1,481 @@
{
"$schema": "https://json-schema.org/draft-07/schema#",
"$id": "https://open-wanderer.github.io/wanderer/schemas/plugin.schema.json",
"title": "wanderer plugin manifest",
"description": "Schema for wanderer plugin.json manifests.",
"type": "object",
"additionalProperties": false,
"required": [
"manifestVersion",
"id",
"type",
"name",
"version",
"runtime",
"capabilities"
],
"properties": {
"$schema": {
"type": "string",
"description": "Optional editor schema reference."
},
"manifestVersion": {
"type": "string",
"const": "1.0"
},
"id": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9_-]*$"
},
"type": {
"type": "string",
"enum": ["trails"]
},
"name": {
"type": "string",
"minLength": 1
},
"description": {
"type": "string"
},
"version": {
"type": "string",
"minLength": 1
},
"runtime": {
"$ref": "#/definitions/runtime"
},
"capabilities": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "#/definitions/capability"
}
},
"auth": {
"$ref": "#/definitions/auth"
},
"permissions": {
"$ref": "#/definitions/permissions"
},
"configSchema": {
"type": "array",
"items": {
"$ref": "#/definitions/configField"
}
},
"hostConfig": {
"$ref": "#/definitions/hostConfig"
},
"metadata": {
"$ref": "#/definitions/metadata"
}
},
"definitions": {
"runtime": {
"type": "object",
"additionalProperties": false,
"required": ["type", "entrypoint"],
"properties": {
"type": {
"type": "string",
"const": "wasm"
},
"entrypoint": {
"type": "string",
"minLength": 1
}
}
},
"capability": {
"type": "object",
"additionalProperties": false,
"required": ["name", "version", "export"],
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"version": {
"type": "string",
"minLength": 1
},
"export": {
"type": "string",
"minLength": 1
},
"requiredHostFunctions": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"uniqueItems": true
},
"job": {
"type": "string",
"minLength": 1
}
}
},
"auth": {
"type": "object",
"additionalProperties": false,
"properties": {
"contexts": {
"type": "object",
"additionalProperties": {
"$ref": "#/definitions/authContext"
}
}
}
},
"authContext": {
"type": "object",
"additionalProperties": false,
"required": ["type"],
"properties": {
"type": {
"type": "string",
"enum": ["oauth2", "api_key", "bearer", "session"]
},
"fields": {
"$ref": "#/definitions/stringList"
},
"authorizationUrl": {
"type": "string",
"format": "uri"
},
"tokenUrl": {
"type": "string",
"format": "uri"
},
"scopes": {
"$ref": "#/definitions/stringList"
},
"scopeSeparator": {
"type": "string"
},
"pkce": {
"type": "boolean"
},
"tokenRequestFormat": {
"type": "string",
"enum": ["json", "form"]
},
"tokenAuth": {
"type": "string",
"enum": ["client_secret_post", "client_secret_basic"]
},
"authorizationParams": {
"$ref": "#/definitions/stringMap"
},
"refresh": {
"$ref": "#/definitions/authRefresh"
},
"placement": {
"type": "string",
"enum": ["query"]
},
"name": {
"type": "string",
"minLength": 1
},
"secretField": {
"type": "string",
"minLength": 1
},
"secretFields": {
"$ref": "#/definitions/stringList"
}
}
},
"authRefresh": {
"type": "object",
"additionalProperties": false,
"required": ["mode"],
"properties": {
"mode": {
"type": "string",
"enum": ["host", "plugin"]
},
"grantType": {
"type": "string",
"minLength": 1
},
"function": {
"type": "string",
"minLength": 1
}
}
},
"permissions": {
"type": "object",
"additionalProperties": false,
"properties": {
"network": {
"$ref": "#/definitions/networkPermissions"
},
"auth": {
"$ref": "#/definitions/stringList"
},
"downloads": {
"$ref": "#/definitions/transferPermissions"
},
"uploads": {
"$ref": "#/definitions/transferPermissions"
}
}
},
"networkPermissions": {
"type": "object",
"additionalProperties": false,
"properties": {
"connectors": {
"type": "array",
"items": {
"$ref": "#/definitions/connector"
}
},
"redirects": {
"$ref": "#/definitions/redirects"
}
}
},
"connector": {
"type": "object",
"additionalProperties": false,
"required": ["name", "type"],
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"type": {
"type": "string",
"enum": ["public_api", "configured"]
},
"fixedBaseURL": {
"type": "string",
"format": "uri"
},
"configKey": {
"type": "string",
"minLength": 1
},
"allowedPathPrefixes": {
"$ref": "#/definitions/stringList"
},
"auth": {
"$ref": "#/definitions/stringList"
},
"supportsMediaAuth": {
"type": "boolean"
},
"supportsStorageRedirects": {
"type": "boolean"
},
"supportsCustomTLS": {
"type": "boolean"
}
},
"allOf": [
{
"if": {
"properties": { "type": { "const": "public_api" } }
},
"then": {
"required": ["fixedBaseURL"],
"not": { "required": ["configKey"] }
}
},
{
"if": {
"properties": { "type": { "const": "configured" } }
},
"then": {
"required": ["configKey"],
"not": { "required": ["fixedBaseURL"] }
}
}
]
},
"redirects": {
"type": "object",
"additionalProperties": false,
"properties": {
"mode": {
"type": "string",
"enum": ["declared_hosts_only"]
},
"hosts": {
"$ref": "#/definitions/stringList"
}
}
},
"transferPermissions": {
"type": "object",
"additionalProperties": false,
"properties": {
"maxBytes": {
"type": "integer",
"minimum": 0
},
"contentTypes": {
"$ref": "#/definitions/stringList"
}
}
},
"configField": {
"type": "object",
"additionalProperties": false,
"required": ["key", "type"],
"properties": {
"key": {
"type": "string",
"minLength": 1
},
"type": {
"type": "string",
"enum": ["boolean", "date", "select", "text", "url"]
},
"label": {
"type": "string"
},
"labels": {
"$ref": "#/definitions/stringMap"
},
"description": {
"type": "string"
},
"descriptions": {
"$ref": "#/definitions/stringMap"
},
"options": {
"type": "array",
"items": {
"$ref": "#/definitions/configFieldOption"
}
},
"default": {},
"required": {
"type": "boolean"
},
"hidden": {
"type": "boolean"
}
}
},
"configFieldOption": {
"type": "object",
"additionalProperties": false,
"required": ["value"],
"properties": {
"value": {
"type": "string"
},
"label": {
"type": "string"
},
"labels": {
"$ref": "#/definitions/stringMap"
}
}
},
"hostConfig": {
"type": "object",
"additionalProperties": true,
"properties": {
"planned": {
"type": "boolean"
},
"completed": {
"type": "boolean"
},
"privacy": {
"type": "string",
"enum": ["original", "settings"]
},
"merge": {
"type": "object",
"additionalProperties": true,
"properties": {
"available": {
"type": "boolean"
},
"enabled": {
"type": "boolean"
}
}
},
"createSummitLogForCompleted": {
"type": "boolean"
},
"categoryMapping": {
"$ref": "#/definitions/stringMap"
},
"connectors": {
"type": "object",
"additionalProperties": {
"type": "object"
}
}
}
},
"metadata": {
"type": "object",
"additionalProperties": true,
"properties": {
"displayName": {
"type": "string"
},
"displayNames": {
"$ref": "#/definitions/stringMap"
},
"descriptions": {
"$ref": "#/definitions/stringMap"
},
"providerCategories": {
"type": "object",
"additionalProperties": {
"$ref": "#/definitions/providerCategoryMetadata"
}
},
"icons": {
"type": "object",
"additionalProperties": true,
"properties": {
"light": {
"type": "string"
},
"dark": {
"type": "string"
}
}
}
}
},
"stringList": {
"type": "array",
"items": {
"type": "string"
},
"uniqueItems": true
},
"stringMap": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"providerCategoryMetadata": {
"type": "object",
"additionalProperties": true,
"properties": {
"labels": {
"$ref": "#/definitions/stringMap"
}
}
}
}
}