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
20 changes: 10 additions & 10 deletions appinfo/info.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,31 @@
<id>jadaagent</id>
<name>Jada Agent</name>
<namespace>JadaAgent</namespace>
<summary>AI Agent powered by Hermesautonomous tasks, workspaces, MCP tools, and Telegram bot</summary>
<summary>AI Agent powered by LibreChatnative MCP tools, multi-model, workspaces, and Nextcloud integration</summary>
<description><![CDATA[
**Jada Agent** brings autonomous AI agent capabilities to your Nextcloud, powered by [Hermes](https://github.com/itsablabla/jada-agent) — the GARZA OS super agent backend.
**Jada Agent** brings AI agent capabilities to your Nextcloud, powered by [LibreChat](https://github.com/danny-avila/LibreChat) — a production-grade chat platform with native MCP support.

### Features

- **Workspaces** — Organize conversations by project (Kuse, Nomad Internet, GARZA OS, etc.)
- **Chat** — Full-page AI chat with SSE streaming and inline tool-call visualization
- **MCP Tools** — 406+ tools across 6 servers (Nextcloud, Composio, Kuse, Vault, ProtonMail, Rube)
- **Telegram Bot** — Same agent, same conversation memory, native Telegram formatting
- **Document Editor** — AI-assisted document editing with inline suggestions
- **Native MCP** — 118 Nextcloud tools (files, calendar, notes, deck, contacts) via LibreChat's built-in MCP client
- **Multi-Model** — Switch between Gemini, Claude, GPT, and more per conversation
- **Agent Framework** — No-code agent builder with per-agent MCP server + prompt configuration
- **Per-User Isolation** — Each Nextcloud user gets isolated chat history and workspaces

### Architecture

- **Hermes Backend** — Native Hermes Agent with built-in context compression (Docker, port 3200)
- **Telegram Bot** — Separate container sharing Hermes conversation memory
- **LibreChat Backend** — OpenAI-compatible API with native MCP, agent framework, and context management (Docker, port 3080)
- **Nextcloud App** — Vue.js 3 frontend + PHP proxy controllers
- **MCP Server** — Nextcloud MCP server providing 118 tools via Streamable HTTP

### Requirements

- Hermes backend (bundled Docker Compose in `backend/`)
- OpenRouter API key (or any OpenAI-compatible provider)
- LibreChat backend (Docker Compose)
- Gemini, OpenRouter, or other LLM API key
]]></description>
<version>0.3.6</version>
<version>0.5.0</version>
<licence>AGPL-3.0-or-later</licence>
<author mail="garzasecure@pm.me">Garza OS</author>
<category>integration</category>
Expand Down
41 changes: 38 additions & 3 deletions appinfo/routes.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,52 @@
// Page routes
['name' => 'page#index', 'url' => '/', 'verb' => 'GET'],

// OpenClaw proxy API routes
// Health
['name' => 'agent#health', 'url' => '/api/health', 'verb' => 'GET'],
['name' => 'agent#healthDetail', 'url' => '/api/health/detail', 'verb' => 'GET'],

// Chat (Agents API — API key auth)
['name' => 'agent#chat', 'url' => '/api/chat', 'verb' => 'POST'],
['name' => 'agent#chatSSE', 'url' => '/api/chat/sse', 'verb' => 'POST'],
['name' => 'agent#reconnect', 'url' => '/api/reconnect', 'verb' => 'POST'],

// Conversations (LibreChat /api/convos — JWT auth)
['name' => 'agent#getConversations', 'url' => '/api/conversations', 'verb' => 'GET'],
['name' => 'agent#getConversation', 'url' => '/api/conversations/{id}', 'verb' => 'GET'],
['name' => 'agent#deleteConversation', 'url' => '/api/conversations/{id}', 'verb' => 'DELETE'],
['name' => 'agent#updateConversation', 'url' => '/api/conversations/update', 'verb' => 'POST'],
['name' => 'agent#archiveConversation', 'url' => '/api/conversations/archive', 'verb' => 'POST'],
['name' => 'agent#genTitle', 'url' => '/api/conversations/{id}/gen-title', 'verb' => 'GET'],

// Messages (LibreChat /api/messages — JWT auth)
['name' => 'agent#getMessages', 'url' => '/api/messages', 'verb' => 'GET'],
['name' => 'agent#getConversationMessages', 'url' => '/api/messages/{id}', 'verb' => 'GET'],
['name' => 'agent#getConversationToolCalls', 'url' => '/api/conversations/{id}/toolcalls', 'verb' => 'GET'],
['name' => 'agent#getRecentToolCalls', 'url' => '/api/toolcalls/recent', 'verb' => 'GET'],
['name' => 'agent#deleteConversation', 'url' => '/api/conversations/{id}', 'verb' => 'DELETE'],

// Search (via /api/messages?search= — JWT auth)
['name' => 'agent#searchMessages', 'url' => '/api/search', 'verb' => 'GET'],

// Tags (LibreChat /api/tags — JWT auth)
['name' => 'agent#getTags', 'url' => '/api/tags', 'verb' => 'GET'],
['name' => 'agent#addTag', 'url' => '/api/tags', 'verb' => 'POST'],
['name' => 'agent#removeTag', 'url' => '/api/tags', 'verb' => 'DELETE'],

// Sharing (LibreChat /api/share — JWT auth)
['name' => 'agent#getSharedLinks', 'url' => '/api/share', 'verb' => 'GET'],
['name' => 'agent#createShareLink', 'url' => '/api/share', 'verb' => 'POST'],
['name' => 'agent#deleteShareLink', 'url' => '/api/share/{id}', 'verb' => 'DELETE'],

// Memories (LibreChat /api/memories — JWT auth)
['name' => 'agent#getMemories', 'url' => '/api/memories', 'verb' => 'GET'],
['name' => 'agent#deleteMemory', 'url' => '/api/memories/{id}', 'verb' => 'DELETE'],

// Presets (LibreChat /api/presets — JWT auth)
['name' => 'agent#getPresets', 'url' => '/api/presets', 'verb' => 'GET'],
['name' => 'agent#createPreset', 'url' => '/api/presets', 'verb' => 'POST'],
['name' => 'agent#deletePreset', 'url' => '/api/presets/{id}', 'verb' => 'DELETE'],

// Legacy endpoints
['name' => 'agent#reconnect', 'url' => '/api/reconnect', 'verb' => 'POST'],
['name' => 'agent#getSkills', 'url' => '/api/skills', 'verb' => 'GET'],
['name' => 'agent#getModels', 'url' => '/api/models', 'verb' => 'GET'],
['name' => 'agent#getConfig', 'url' => '/api/config', 'verb' => 'GET'],
Expand Down
4 changes: 4 additions & 0 deletions js/jadaagent-admin.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ document.addEventListener('DOMContentLoaded', () => {
const msgEl = document.getElementById('openclaw-settings-msg')
const urlInput = document.getElementById('openclaw-url')
const tokenInput = document.getElementById('openclaw-token')
const serviceEmailInput = document.getElementById('librechat-service-email')
const servicePasswordInput = document.getElementById('librechat-service-password')

if (!saveBtn) return

Expand All @@ -27,6 +29,8 @@ document.addEventListener('DOMContentLoaded', () => {
body: JSON.stringify({
openclaw_url: urlInput.value.trim(),
openclaw_token: tokenInput.value.trim(),
librechat_service_email: serviceEmailInput.value.trim(),
librechat_service_password: servicePasswordInput.value.trim(),
}),
},
)
Expand Down
18 changes: 9 additions & 9 deletions js/jadaagent-main.js

Large diffs are not rendered by default.

Loading