49 lines
1.6 KiB
C++
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;
|
|
}
|