metal-kompanion/src/middleware/kompanioncontroller.cpp

49 lines
1.6 KiB
C++

#include "kompanioncontroller.h"
#include "regexregistry.h"
#include "guardrailspolicy.h"
#include <QCryptographicHash>
#include <QDateTime>
KompanionController::KompanionController(QObject *parent) : QObject(parent) {
registry_ = new RegexRegistry(this);
policy_ = new DefaultGuardrails(this);
}
QString KompanionController::sendPrompt(const QString &prompt) {
QString tool; QVariantMap args;
if (!mapPromptToTool(prompt, tool, args)) {
const QString req = generateRequestId();
emit textOutput(req, QStringLiteral("(no mapping) %1").arg(prompt));
return QString();
}
const QString req = generateRequestId();
if (policy_) {
auto dec = policy_->evaluate(tool, args);
if (!dec.allow) {
emit textOutput(req, QStringLiteral("blocked by guardrails: %1").arg(dec.reason));
return QString();
}
}
emit toolRequested(req, tool, args);
return req;
}
void KompanionController::onToolResult(const QString &requestId, const QString &resultJson, bool success) {
Q_UNUSED(success);
emit textOutput(requestId, resultJson);
}
void KompanionController::cancelRequest(const QString &requestId) {
emit textOutput(requestId, QStringLiteral("cancel requested"));
}
QString KompanionController::generateRequestId() const {
QByteArray seed = QByteArray::number(QDateTime::currentMSecsSinceEpoch());
return QString::fromLatin1(QCryptographicHash::hash(seed, QCryptographicHash::Sha256).toHex().left(12));
}
bool KompanionController::mapPromptToTool(const QString &prompt, QString &toolName, QVariantMap &args) const {
if (registry_) return registry_->match(prompt, toolName, args);
return false;
}