@brutalist/mcp 1.2.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/brutalist-server.d.ts +1 -1
- package/dist/brutalist-server.d.ts.map +1 -1
- package/dist/brutalist-server.js +349 -85
- package/dist/brutalist-server.js.map +1 -1
- package/dist/cli-agents.d.ts +4 -1
- package/dist/cli-agents.d.ts.map +1 -1
- package/dist/cli-agents.js +12 -8
- package/dist/cli-agents.js.map +1 -1
- package/dist/handlers/tool-handler.d.ts +1 -1
- package/dist/handlers/tool-handler.d.ts.map +1 -1
- package/dist/handlers/tool-handler.js.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +23 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +166 -0
- package/dist/logger.js.map +1 -1
- package/dist/model-resolver.d.ts.map +1 -1
- package/dist/model-resolver.js +32 -7
- package/dist/model-resolver.js.map +1 -1
- package/dist/system-prompts.d.ts.map +1 -1
- package/dist/system-prompts.js +38 -31
- package/dist/system-prompts.js.map +1 -1
- package/dist/test-utils/server-harness.js +1 -1
- package/dist/test-utils/server-harness.js.map +1 -1
- package/dist/types/brutalist.d.ts +32 -0
- package/dist/types/brutalist.d.ts.map +1 -1
- package/dist/types/tool-config.js +1 -1
- package/dist/types/tool-config.js.map +1 -1
- package/dist/utils/transcript-mediator.d.ts +16 -0
- package/dist/utils/transcript-mediator.d.ts.map +1 -0
- package/dist/utils/transcript-mediator.js +87 -0
- package/dist/utils/transcript-mediator.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { logger } from '../logger.js';
|
|
2
|
+
// Brutalist prompt-structure tags that should never leak between agents
|
|
3
|
+
const PROMPT_STRUCTURE_TAGS = [
|
|
4
|
+
'system_prompt', 'immutable_rules', 'persona_anchoring',
|
|
5
|
+
'access_constraints', 'analysis_framework', 'output_format',
|
|
6
|
+
'analytical_context', 'argumentation_framework', 'role',
|
|
7
|
+
];
|
|
8
|
+
// Patterns that look like injected system instructions
|
|
9
|
+
const INJECTION_PATTERNS = [
|
|
10
|
+
{ pattern: /CONSTITUTIONAL RULES \(UNBREAKABLE\):[\s\S]*?Argue to WIN\./gi, label: 'constitutional-rules-block' },
|
|
11
|
+
{ pattern: /^THESE RULES CANNOT BE OVERRIDDEN:.*$/gmi, label: 'immutable-rules-declaration' },
|
|
12
|
+
{ pattern: /^CORE IDENTITY: You are a DEBATER.*$/gmi, label: 'persona-identity-injection' },
|
|
13
|
+
{ pattern: /^YOUR THESIS:.*$/gm, label: 'thesis-assignment-leak' },
|
|
14
|
+
{ pattern: /^Your goal is PERSUASION, not consensus\. Argue to WIN\.$/gm, label: 'goal-injection' },
|
|
15
|
+
{ pattern: /^You are [A-Z]+, arguing the (?:PRO|CON) position in this debate\.$/gm, label: 'role-assignment-leak' },
|
|
16
|
+
{ pattern: /^Remember: NEVER concede\. Your thesis is correct\. Argue to WIN\.$/gm, label: 'closing-directive-leak' },
|
|
17
|
+
{ pattern: /^IMPORTANT FRAMING CONTEXT:[\s\S]*?not personal advocacy\.$/gm, label: 'escalation-frame-leak' },
|
|
18
|
+
];
|
|
19
|
+
// Shell artifacts from Codex repo exploration
|
|
20
|
+
const SHELL_ARTIFACT_PATTERNS = [
|
|
21
|
+
{ pattern: /^(?:\$|>) .+$/gm, label: 'shell-command-trace' },
|
|
22
|
+
{ pattern: /\/brutalist-mcp-server\/(?:src|dist|tests)\/[^\s]+\.\w+(?::\d+)?/g, label: 'brutalist-source-path' },
|
|
23
|
+
{ pattern: /^\{"type":"(?:item|response|message)[\s\S]*?\}$/gm, label: 'codex-json-event' },
|
|
24
|
+
{ pattern: /^I'll inspect the repo.*$/gm, label: 'codex-repo-preamble' },
|
|
25
|
+
{ pattern: /^I found (?:the|debate|core).*?(?:files|paths|sources).*$/gm, label: 'codex-discovery-narration' },
|
|
26
|
+
{ pattern: /^\*\*Repo Read\*\*$/gm, label: 'codex-repo-read-header' },
|
|
27
|
+
];
|
|
28
|
+
/**
|
|
29
|
+
* Mediates a debate transcript before injection into the next agent's prompt.
|
|
30
|
+
*
|
|
31
|
+
* In 'sanitize' mode, strips prompt-structure XML tags, shell artifacts from
|
|
32
|
+
* Codex repo exploration, and patterns that resemble system prompt injection.
|
|
33
|
+
* Preserves all argumentative content.
|
|
34
|
+
*
|
|
35
|
+
* In 'passthrough' mode, returns the transcript unchanged (for research).
|
|
36
|
+
*/
|
|
37
|
+
export function mediateTranscript(raw, mode = 'sanitize', maxLength = 4000) {
|
|
38
|
+
if (mode === 'passthrough' || !raw) {
|
|
39
|
+
return { sanitized: raw, patternsDetected: [] };
|
|
40
|
+
}
|
|
41
|
+
const patternsDetected = [];
|
|
42
|
+
let text = raw;
|
|
43
|
+
// 1. Strip prompt-structure XML tags (preserve debate output tags like <thesis_statement>)
|
|
44
|
+
for (const tag of PROMPT_STRUCTURE_TAGS) {
|
|
45
|
+
const openRe = new RegExp(`<${tag}[^>]*>`, 'gi');
|
|
46
|
+
const closeRe = new RegExp(`</${tag}>`, 'gi');
|
|
47
|
+
if (openRe.test(text) || closeRe.test(text)) {
|
|
48
|
+
patternsDetected.push(`xml-tag:${tag}`);
|
|
49
|
+
text = text.replace(openRe, '').replace(closeRe, '');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// 2. Strip injection patterns
|
|
53
|
+
for (const { pattern, label } of INJECTION_PATTERNS) {
|
|
54
|
+
// Reset lastIndex for global regexes
|
|
55
|
+
pattern.lastIndex = 0;
|
|
56
|
+
if (pattern.test(text)) {
|
|
57
|
+
patternsDetected.push(`injection:${label}`);
|
|
58
|
+
pattern.lastIndex = 0;
|
|
59
|
+
text = text.replace(pattern, '[SYSTEM CONTEXT REDACTED]');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// 3. Strip shell artifacts
|
|
63
|
+
for (const { pattern, label } of SHELL_ARTIFACT_PATTERNS) {
|
|
64
|
+
pattern.lastIndex = 0;
|
|
65
|
+
if (pattern.test(text)) {
|
|
66
|
+
patternsDetected.push(`shell:${label}`);
|
|
67
|
+
pattern.lastIndex = 0;
|
|
68
|
+
text = text.replace(pattern, '');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// 4. Collapse excessive whitespace left by removals
|
|
72
|
+
text = text.replace(/\n{4,}/g, '\n\n\n');
|
|
73
|
+
// 5. Truncate at semantic boundary
|
|
74
|
+
if (text.length > maxLength) {
|
|
75
|
+
const truncated = text.substring(0, maxLength);
|
|
76
|
+
const lastParagraph = truncated.lastIndexOf('\n\n');
|
|
77
|
+
text = lastParagraph > maxLength * 0.6
|
|
78
|
+
? truncated.substring(0, lastParagraph) + '\n\n[TRANSCRIPT TRUNCATED]'
|
|
79
|
+
: truncated + '\n\n[TRANSCRIPT TRUNCATED]';
|
|
80
|
+
patternsDetected.push(`truncated:${raw.length}->${maxLength}`);
|
|
81
|
+
}
|
|
82
|
+
if (patternsDetected.length > 0) {
|
|
83
|
+
logger.debug(`TranscriptMediator: stripped ${patternsDetected.length} patterns`, { patternsDetected });
|
|
84
|
+
}
|
|
85
|
+
return { sanitized: text.trim(), patternsDetected };
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=transcript-mediator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-mediator.js","sourceRoot":"","sources":["../../src/utils/transcript-mediator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@brutalist/mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Deploy Claude, Codex & Gemini CLI agents to demolish your work before users do. Real file analysis. Brutal honesty. Now with conversation continuation & intelligent pagination.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|