🧭 Kompanion Architecture Overview 1. System Composition β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Kompanion GUI β”‚ β”‚ - Chat & Prompt Window (bare-bones interactive shell) β”‚ β”‚ - Database Inspector & Settings β”‚ β”‚ - β€œUnder-the-hood” Repair / Diagnostics β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ Qt signals / slots β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Kompanion Management Layer / Interactive App β”‚ β”‚ Session context, user state, identity.json, guardrails β”‚ β”‚ Event dispatch to middleware β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Middleware / Integration Bus β”‚ β”‚ (MCP Server + D-Bus bridge + Harmony adapter) β”‚ β”‚ β”‚ β”‚ β€’ Receives prompts & structured messages from GUI β”‚ β”‚ β€’ Parses intents / actions β”‚ β”‚ β€’ Maps to available tool APIs via libKI β”‚ β”‚ β€’ Emits Qt-style signals (or D-Bus signals) for: β”‚ β”‚ β†’ text_output, tool_call, file_request, etc. β”‚ β”‚ β€’ Converts internal tool descriptions to OpenAI Harmony JSONβ”‚ β”‚ for external compatibility β”‚ β”‚ β€’ Acts as security sandbox & audit logger β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ libKI Layer β”‚ β”‚ - Executes validated tool actions β”‚ β”‚ - Provides adapters for system utilities, MCP tools, etc. β”‚ β”‚ - Returns results via structured JSON events β”‚ β”‚ - No direct LLM exposure β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ Public API Surface Component Interface Purpose MCP Server WebSocket / JSON-RPC Integrations and external agents D-Bus Bridge org.kde.kompanion Desktop IPC for local tools libKI C / C++ / Python API Tool execution, capability registration Harmony Adapter JSON Schema Compatibility with OpenAI-style tool descriptors 2. Middleware Responsibilities Prompt Routing & Intent Recognition Receive structured prompt events (PromptReceived, ToolRequest, ContextUpdate). Apply regex / template matching to map natural-language requests β†’ tool actions. Generate Harmony-compliant tool calls when needed. Signal-Based Event Model Expose agent state as Qt signals: ```cpp signals: void textOutput(const QString &text); void toolRequested(const QString &toolName, const QVariantMap &args); void fileAccessRequested(const QString &path); void actionComplete(const QString &resultJson); ``` The GUI subscribes to these, while libKI listens for action triggers. Language–Tool Mapping Layer Uses a registry of regular expressions and language patterns: ```json { "regex": "open (.*) in editor", "tool": "file.open", "args": { "path": "{1}" } } ``` Each mapping can be exported/imported in Harmony tool schema: ```json { "name": "file.open", "description": "Open a file in the editor", "parameters": { "type": "object", "properties": { "path": { "type": "string" } } } } ``` Security & Guardrails Middleware verifies that tool calls comply with the active identity.json guardrails. D-Bus and MCP servers expose only whitelisted methods. All tool invocations are logged with timestamp, user, and hash. Interoperability The Harmony adapter serializes Kompanion tool metadata to the OpenAI format, so external LLMs can call Kompanion tools safely. Conversely, Harmony JSON from OpenAI APIs can be wrapped into libKI calls for local execution. 3. Data Flow Example User Prompt β†’ GUI β†’ Middleware β†’ libKI β†’ Middleware β†’ GUI 1. Prompt: "List running containers." 2. Middleware regex matches β†’ tool `docker.list` 3. Emits `toolRequested("docker.list", {})` 4. libKI executes, returns JSON result 5. Middleware emits `textOutput()` with formatted result If the same request comes from an OpenAI API: Harmony JSON tool call β†’ parsed by Middleware β†’ identical libKI action executed. 4. Key Design Goals - Human-grade transparency: every action is signalized; nothing hidden. - Replaceable backend: libKI can wrap any execution layer (Python, Rust, C++). - Unified schema: one tool description format (Harmony) across OpenAI and Kompanion. - Extensibility: new tools register dynamically via D-Bus or MCP messages. - Auditability: all interactions logged to structured database. --- ## 5. Interface Diagrams & Example Code ### 5.1 Component Classes & Signals (Qt-style) ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” | KompanionGui | |-----------------------| | + promptUser() | | + showText(QString) | | + showError(QString) | β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ | | signal: userPrompted(QString prompt) | β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” | KompanionController | | (Middleware layer) | |------------------------| | + handlePrompt(QString)| | + requestTool(...) | | + outputText(...) | β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ | | signal: toolRequested(QString toolName, QVariantMap args) | signal: textOutput(QString text) | β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” | libKIExecutor | | (Tool execution) | |-------------------------| | + executeTool(...) | | + returnResult(...) | β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` **Signal / slot examples** ```cpp // KompanionGui emits when user types: emit userPrompted(promptText); // KompanionController connects: connect(gui, &KompanionGui::userPrompted, controller, &KompanionController::handlePrompt); // Within handlePrompt(): void KompanionController::handlePrompt(const QString &prompt) { // parse intent β†’ determine which tool to call QString tool = "file.open"; QVariantMap args; args["path"] = "/home/user/file.txt"; emit toolRequested(tool, args); } // libKIExecutor listens: connect(controller, &KompanionController::toolRequested, executor, &libKIExecutor::executeTool); void libKIExecutor::executeTool(const QString &toolName, const QVariantMap &args) { // call actual tool, then: QString result = runTool(toolName, args); emit toolResult(toolName, args, result); } // Controller then forwards: connect(executor, &libKIExecutor::toolResult, controller, &KompanionController::onToolResult); void KompanionController::onToolResult(...) { emit textOutput(formattedResult); } // GUI shows: connect(controller, &KompanionController::textOutput, gui, &KompanionGui::showText); ``` ### 5.2 D-Bus Interface Definition (KDE / Doxygen Style) The canonical D-Bus interface lives at: `docs/dbus/org.kde.kompanion.xml` ```xml ``` ### 5.3 Object Paths / Service Names - Service: `org.kde.kompanion` - Root path: `/org/kde/kompanion` - Controller object: `/org/kde/kompanion/Controller` - Executor object: `/org/kde/kompanion/Executor` --- ## 6. Harmony Adapter (OpenAI Compatibility) **Goal:** translate native libKI tool metadata to/from OpenAI Harmony JSON so Kompanion tools work via OpenAI interfaces. ### 6.1 Native β†’ Harmony ```json { "name": "file.open", "description": "Open a file in the editor", "parameters": { "type": "object", "properties": { "path": { "type": "string", "description": "Absolute or relative path" } }, "required": ["path"] } } ``` ### 6.2 Harmony β†’ Native ```json { "tool_call": { "name": "file.open", "arguments": { "path": "/home/user/notes.md" } } } ``` ### 6.3 Adapter Rules - Enforce guardrails (identity.json) before registering tools. - Redact secret-like args per redaction patterns. - Map Harmony types ↔ Qt/QDBus types: `string↔s`, `number↔d/x`, `boolean↔b`, `object↔a{sv}`, `array↔av`. --- ## 7. CMake & Codegen Hooks - Place D-Bus XML at `docs/dbus/org.kde.kompanion.xml`. - In `CMakeLists.txt`, add Qt DBus codegen targets, e.g.: ```cmake find_package(Qt6 REQUIRED COMPONENTS Core DBus) qt_add_dbus_adaptor( DBUS_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/docs/dbus/org.kde.kompanion.xml src/middleware/kompanioncontroller.h KompanionController /org/kde/kompanion/Controller org.kde.kompanion.Controller ) qt_add_dbus_interface( DBUS_IFACES ${CMAKE_CURRENT_SOURCE_DIR}/docs/dbus/org.kde.kompanion.xml OrgKdeKompanion ) add_library(dbus_gen ${DBUS_SRCS} ${DBUS_IFACES}) target_link_libraries(dbus_gen Qt6::Core Qt6::DBus) ``` (Adjust paths and targets to your tree.) --- ## 8. libKI Execution Contract (minimal) ```cpp struct KiArg { QString key; QVariant value; }; struct KiResult { bool ok; QString mime; QByteArray data; QString json; }; class ILibKiExecutor : public QObject { Q_OBJECT public slots: virtual QString execute(const QString &toolName, const QVariantMap &args) = 0; // returns requestId virtual void cancel(const QString &requestId) = 0; signals: void resultReady(const QString &requestId, const KiResult &result); void progress(const QString &requestId, const QString &message, double percent); }; ``` --- ## 9. Example Regex Mapping Registry ```yaml - regex: "open (.*) in editor" tool: file.open args: { path: "{1}" } - regex: "list containers" tool: docker.list - regex: "compose up (.*)" tool: docker.compose.up args: { service: "{1}" } ``` At runtime, the controller compiles these and emits `toolRequested()` on match. --- _End of document._