Each adapter is a self-contained folder under repo-root packages/wlya-adapters/<type>/.
Adding a new adapter should not require edits to the Gateway app, Vue UI, or Registry.kt — only files in this tree plus a Gradle rebuild (codegen).
packages/wlya-adapters/<type>/
adapter.json metadata (type, label, defaults, factoryKind)
<Type>Adapter.kt runtime implementation (JVM + Android)
ui-vue/
Form.vue desktop-ui (auto-discovered by Vite glob)
ui-android/
<Type>AdapterForm.kt Gateway Setup / Settings (apps/android-gateway/app)
Example:
packages/wlya-adapters/email/
adapter.json
EmailAdapter.kt
EmailAdapterHelpers.kt
ui-vue/Form.vue
ui-android/EmailAdapterForm.kt
- Create
packages/wlya-adapters/mytype/ - Add
adapter.json:{ "type": "mytype", "label": "My Adapter", "adapterClass": "MytypeAdapter", "factoryKind": "simple", "defaultConfig": { "key": "value" } }factoryKind: "simple"— factory(id, config) -> AdapterClass(id, config)factoryKind: "mock"—MockAdapteronly (LocalStore + storePath)
- Implement
MytypeAdapter.ktextendingBaseAdapter - Add
ui-vue/Form.vue— propsinitialConfig, emitconfig - Add
ui-android/MytypeAdapterForm.ktimplementingAdapterAndroidForm(packagecom.wlya.core.adapters.mytype.ui.android) - Rebuild (codegen runs automatically):
./gradlew :wlya-core:compileKotlin :android-client:app:compileDebugKotlin pnpm build
Task generateAdapterRegistries (gradle/generate-adapters.gradle.kts at repo root) scans adapter.json and *AdapterForm.kt, generates:
| Output | Location |
|---|---|
registerAllAdapters() |
packages/wlya-core/build/generated/kotlin/.../GeneratedAdapterRegistry.kt |
GeneratedAndroidFormRegistry |
apps/android-gateway/app/build/generated/kotlin/.../ |
wlya-core compiles adapter Kotlin from packages/wlya-adapters/ but excludes **/ui-android/** and **/ui-vue/**; Android forms compile in apps/android-gateway/app.
| Platform | Discovery | Defaults |
|---|---|---|
| Desktop API | registerAllAdapters() → Registry.list() |
adapter.json via codegen |
| desktop-ui | import.meta.glob('@wlya/adapters/*/ui-vue/Form.vue') |
API GET /api/adapter-types |
| Android SetupActivity | GeneratedAndroidFormRegistry |
form + saved SharedPreferences |
| Config key | Default | Description |
|---|---|---|
sendMode |
smtp |
smtp or imap (IMAP APPEND, no SMTP rate limit) |
imapFolder |
INBOX |
poll, send, cleanup folder |
smtpTo |
login | SMTP recipient |
tunnelMessageTtlSeconds |
900 |
delete stale [TUNNEL] messages from mailbox |