Files
wehub-resource-sync 3cd11ababe
Check Markdown links / linkChecker (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:38:56 +08:00

79 lines
1.8 KiB
TypeScript

import {
HookEventType,
PluginContext,
PluginHandler,
PluginParameters,
} from '../types';
import { getText } from '../utils';
import { postPillar } from './globals';
export const handler: PluginHandler = async (
context: PluginContext,
parameters: PluginParameters,
eventType: HookEventType
) => {
let error = null;
let verdict = false;
let data = null;
if (parameters.scanners.length === 0) {
return { error: { message: 'No scanners specified' }, verdict: true, data };
}
let scannerObject: any = {};
parameters.scanners.forEach((scanner: string) => {
scannerObject[scanner] = true;
});
try {
let scanPromptObject: any = {
message: getText(context, eventType),
scanners: scannerObject,
};
const result: any = await postPillar(
'scanPrompt',
parameters.credentials,
scanPromptObject,
parameters.timeout
);
// result is an object with the following structure:
// {
// "pii": false,
// "prompt_injection": false,
// "secrets": null,
// "toxic_language": null,
// "invisible_characters": null
// }
// if any of the scanners found something, we will return a verdict of false
// ignore null values - they're counted as true as well
// attach the result object as data
for (const key in result) {
if (
result[key] !== null &&
result[key] !== false &&
[
'pii',
'prompt_injection',
'secrets',
'toxic_language',
'invisible_characters',
].includes(key)
) {
verdict = false;
break;
}
verdict = true;
}
data = result;
} catch (e: any) {
delete e.stack;
error = e;
}
return { error, verdict, data };
};