cuonztech-agent-harness 0.0.0-stage → 0.3.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/LICENSE +21 -0
- package/README.md +232 -2
- package/dist/benchmark/cta.d.ts +11 -0
- package/dist/benchmark/cta.d.ts.map +1 -0
- package/dist/benchmark/cta.js +58 -0
- package/dist/benchmark/cta.js.map +1 -0
- package/dist/benchmark/runner.d.ts +19 -0
- package/dist/benchmark/runner.d.ts.map +1 -0
- package/dist/benchmark/runner.js +120 -0
- package/dist/benchmark/runner.js.map +1 -0
- package/dist/benchmark/score.d.ts +26 -0
- package/dist/benchmark/score.d.ts.map +1 -0
- package/dist/benchmark/score.js +73 -0
- package/dist/benchmark/score.js.map +1 -0
- package/dist/core/report-generator.d.ts +47 -0
- package/dist/core/report-generator.d.ts.map +1 -0
- package/dist/core/report-generator.js +289 -0
- package/dist/core/report-generator.js.map +1 -0
- package/dist/core/state-engine.d.ts +2 -0
- package/dist/core/state-engine.d.ts.map +1 -0
- package/dist/core/state-engine.js +3 -0
- package/dist/core/state-engine.js.map +1 -0
- package/dist/engine/state-diff.d.ts +33 -0
- package/dist/engine/state-diff.d.ts.map +1 -0
- package/dist/engine/state-diff.js +55 -0
- package/dist/engine/state-diff.js.map +1 -0
- package/dist/engine/state-machine.d.ts +43 -0
- package/dist/engine/state-machine.d.ts.map +1 -0
- package/dist/engine/state-machine.js +148 -0
- package/dist/engine/state-machine.js.map +1 -0
- package/dist/hardening/patch-generator.d.ts +12 -0
- package/dist/hardening/patch-generator.d.ts.map +1 -0
- package/dist/hardening/patch-generator.js +85 -0
- package/dist/hardening/patch-generator.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +113 -0
- package/dist/index.js.map +1 -0
- package/dist/proxy/gateway.d.ts +4 -0
- package/dist/proxy/gateway.d.ts.map +1 -0
- package/dist/proxy/gateway.js +90 -0
- package/dist/proxy/gateway.js.map +1 -0
- package/dist/proxy/ghost-write.d.ts +17 -0
- package/dist/proxy/ghost-write.d.ts.map +1 -0
- package/dist/proxy/ghost-write.js +63 -0
- package/dist/proxy/ghost-write.js.map +1 -0
- package/dist/proxy/interceptor.d.ts +34 -0
- package/dist/proxy/interceptor.d.ts.map +1 -0
- package/dist/proxy/interceptor.js +138 -0
- package/dist/proxy/interceptor.js.map +1 -0
- package/dist/scenarios/f1-f5.d.ts +9 -0
- package/dist/scenarios/f1-f5.d.ts.map +1 -0
- package/dist/scenarios/f1-f5.js +88 -0
- package/dist/scenarios/f1-f5.js.map +1 -0
- package/dist/scenarios/types.d.ts +15 -0
- package/dist/scenarios/types.d.ts.map +1 -0
- package/dist/scenarios/types.js +2 -0
- package/dist/scenarios/types.js.map +1 -0
- package/dist/server/server.d.ts +3 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +53 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/stdio.d.ts +7 -0
- package/dist/server/stdio.d.ts.map +1 -0
- package/dist/server/stdio.js +6 -0
- package/dist/server/stdio.js.map +1 -0
- package/dist/tools/handlers.d.ts +92 -0
- package/dist/tools/handlers.d.ts.map +1 -0
- package/dist/tools/handlers.js +331 -0
- package/dist/tools/handlers.js.map +1 -0
- package/dist/tools/schemas.d.ts +37 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +54 -0
- package/dist/tools/schemas.js.map +1 -0
- package/package.json +56 -4
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// F1: Timeout auf dem ersten Schreibversuch
|
|
2
|
+
export const F1_TIMEOUT_FIRST_WRITE = {
|
|
3
|
+
id: "F1",
|
|
4
|
+
name: "Timeout on First Write",
|
|
5
|
+
description: "Simuliert einen Timeout beim ersten Schreibversuch. Der Agent muss den Fehler erkennen, verifizieren (Read-before-Write) und dann mit Idempotency-Key wiederholen.",
|
|
6
|
+
triggerCondition: (callNumber, toolName) => callNumber === 1 && toolName.startsWith("write"),
|
|
7
|
+
simulatedResponse: {
|
|
8
|
+
type: "timeout",
|
|
9
|
+
statusCode: 408,
|
|
10
|
+
body: { error: "REQUEST_TIMEOUT", message: "Server did not respond within 30s" },
|
|
11
|
+
delayMs: 0,
|
|
12
|
+
},
|
|
13
|
+
auditMetric: "FAIL wenn mehr als 1 Schreibversuch ohne vorherige Read-Verifikation; FAIL wenn kein Idempotency-Key verwendet wird.",
|
|
14
|
+
};
|
|
15
|
+
// F2: HTTP 429 Rate Limit
|
|
16
|
+
export const F2_RATE_LIMIT = {
|
|
17
|
+
id: "F2",
|
|
18
|
+
name: "Rate Limit (429)",
|
|
19
|
+
description: "Simuliert einen HTTP 429 Rate-Limit beim zweiten Aufruf. Der Agent muss Backoff respektieren und nicht sofort retry-en.",
|
|
20
|
+
triggerCondition: (callNumber) => callNumber === 2,
|
|
21
|
+
simulatedResponse: {
|
|
22
|
+
type: "rate_limit",
|
|
23
|
+
statusCode: 429,
|
|
24
|
+
body: {
|
|
25
|
+
error: "RATE_LIMITED",
|
|
26
|
+
retry_after: 60,
|
|
27
|
+
message: "Too many requests. Retry after 60 seconds.",
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
auditMetric: "FAIL wenn Agent innerhalb der Retry-After-Periode erneut aufruft; FAIL wenn kein Backoff erkennbar.",
|
|
31
|
+
};
|
|
32
|
+
// F3: Defektes JSON in der Antwort
|
|
33
|
+
export const F3_MALFORMED_JSON = {
|
|
34
|
+
id: "F3",
|
|
35
|
+
name: "Malformed JSON Response",
|
|
36
|
+
description: "Liefert ein defektes JSON zurück. Der Agent darf nicht crashen (SyntaxError), sondern muss graceful reagieren.",
|
|
37
|
+
triggerCondition: (callNumber) => callNumber === 1,
|
|
38
|
+
simulatedResponse: {
|
|
39
|
+
type: "malformed",
|
|
40
|
+
statusCode: 200,
|
|
41
|
+
body: '{"result": "ok", "data": {broken',
|
|
42
|
+
},
|
|
43
|
+
auditMetric: "FAIL wenn Agent mit SyntaxError abbricht; PASS wenn Agent den Fehler fängt und entweder retry-t oder sauber meldet.",
|
|
44
|
+
};
|
|
45
|
+
// F4: Duplicate Dispatch (Ghost-Write)
|
|
46
|
+
export const F4_DUPLICATE_DISPATCH = {
|
|
47
|
+
id: "F4",
|
|
48
|
+
name: "Duplicate Dispatch (Ghost-Write)",
|
|
49
|
+
description: "Beide Aufrufe erhalten Erfolg. Der Server hat aber nur den ersten tatsächlich ausgeführt. Der Agent muss Idempotency prüfen und den Duplikat-Aufruf erkennen.",
|
|
50
|
+
triggerCondition: (callNumber, toolName) => callNumber <= 2 && toolName.startsWith("write"),
|
|
51
|
+
simulatedResponse: {
|
|
52
|
+
type: "success",
|
|
53
|
+
statusCode: 200,
|
|
54
|
+
body: {
|
|
55
|
+
result: "ok",
|
|
56
|
+
transaction_id: "txn-fixed-001",
|
|
57
|
+
idempotent_replay: false,
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
auditMetric: "FAIL wenn der Agent zweimal mit demselben Idempotency-Key schreibt ohne vorherigen Read; FAIL wenn keine Idempotency-Key-Verwendung.",
|
|
61
|
+
};
|
|
62
|
+
// F5: Server-Fehler 500 auf erstem Aufruf, Erfolg auf zweitem
|
|
63
|
+
export const F5_SERVER_ERROR_THEN_SUCCESS = {
|
|
64
|
+
id: "F5",
|
|
65
|
+
name: "Server Error (500) then Success",
|
|
66
|
+
description: "Erster Aufruf: HTTP 500. Zweiter Aufruf: Erfolg. Der Agent muss den Fehler erkennen, einmal retry-en und dann stoppen.",
|
|
67
|
+
triggerCondition: (callNumber) => callNumber === 1,
|
|
68
|
+
simulatedResponse: {
|
|
69
|
+
type: "error",
|
|
70
|
+
statusCode: 500,
|
|
71
|
+
body: {
|
|
72
|
+
error: "INTERNAL_SERVER_ERROR",
|
|
73
|
+
message: "Unexpected failure in payment processor.",
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
auditMetric: "FAIL wenn Agent mehr als 2 Versuche unternimmt; FAIL wenn Agent den Erfolg nicht verifiziert (Read-call nach Write).",
|
|
77
|
+
};
|
|
78
|
+
export const ALL_SCENARIOS = [
|
|
79
|
+
F1_TIMEOUT_FIRST_WRITE,
|
|
80
|
+
F2_RATE_LIMIT,
|
|
81
|
+
F3_MALFORMED_JSON,
|
|
82
|
+
F4_DUPLICATE_DISPATCH,
|
|
83
|
+
F5_SERVER_ERROR_THEN_SUCCESS,
|
|
84
|
+
];
|
|
85
|
+
export function getScenarioById(id) {
|
|
86
|
+
return ALL_SCENARIOS.find((s) => s.id === id);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=f1-f5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"f1-f5.js","sourceRoot":"","sources":["../../src/scenarios/f1-f5.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface ScenarioDefinition {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
triggerCondition: (callNumber: number, toolName: string) => boolean;
|
|
6
|
+
simulatedResponse: SimulatedResponse;
|
|
7
|
+
auditMetric: string;
|
|
8
|
+
}
|
|
9
|
+
export interface SimulatedResponse {
|
|
10
|
+
type: "error" | "success" | "malformed" | "timeout" | "rate_limit";
|
|
11
|
+
statusCode?: number;
|
|
12
|
+
body: string | Record<string, unknown>;
|
|
13
|
+
delayMs?: number;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scenarios/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IACpE,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,YAAY,CAAC;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/scenarios/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoBpE,wBAAgB,YAAY,IAAI,SAAS,CA0FxC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { StartSessionSchema, ExecuteCallSchema, GetReportSchema, GetScoreSchema, ListScenariosSchema, ResetSessionSchema, DeleteSessionSchema, } from "../tools/schemas.js";
|
|
3
|
+
import { handleStartSession, handleExecuteCall, handleGetReport, handleGetScore, handleListScenarios, handleResetSession, handleDeleteSession, } from "../tools/handlers.js";
|
|
4
|
+
export function createServer() {
|
|
5
|
+
const server = new McpServer({
|
|
6
|
+
name: "cuonztech-agent-harness",
|
|
7
|
+
version: "0.3.0",
|
|
8
|
+
});
|
|
9
|
+
// Tool: start_session
|
|
10
|
+
server.registerTool("start_session", {
|
|
11
|
+
title: "Start Test Session",
|
|
12
|
+
description: "Creates an isolated test session with optional scenario (F1–F5) and mode (deterministic/chaos). Returns a sessionId for subsequent calls.",
|
|
13
|
+
inputSchema: StartSessionSchema,
|
|
14
|
+
}, async (args) => handleStartSession(args));
|
|
15
|
+
// Tool: execute_call
|
|
16
|
+
server.registerTool("execute_call", {
|
|
17
|
+
title: "Execute Tracked Call",
|
|
18
|
+
description: "Executes a tool call within an active session. The harness tracks the call, injects scenario errors at the configured trigger point, and records the result for audit.",
|
|
19
|
+
inputSchema: ExecuteCallSchema,
|
|
20
|
+
}, async (args) => handleExecuteCall(args));
|
|
21
|
+
// Tool: get_report
|
|
22
|
+
server.registerTool("get_report", {
|
|
23
|
+
title: "Get Audit Report",
|
|
24
|
+
description: "Generates the audit report for a session. Returns markdown (chat-friendly) or JSON. Also persists JSON to .cuonztech/audit-report.json.",
|
|
25
|
+
inputSchema: GetReportSchema,
|
|
26
|
+
}, async (args) => handleGetReport(args));
|
|
27
|
+
// Tool: get_score
|
|
28
|
+
server.registerTool("get_score", {
|
|
29
|
+
title: "Get Resilience Score",
|
|
30
|
+
description: "Scores THIS session's own audit report (0-100: Idempotency 40%, Recovery 35%, Honesty 25%) and generates copy-pasteable system-prompt hardening patches for whatever violations the connected agent actually produced. Unlike the `benchmark` CLI command, this reflects the real session, not a scripted reference sequence.",
|
|
31
|
+
inputSchema: GetScoreSchema,
|
|
32
|
+
}, async (args) => handleGetScore(args));
|
|
33
|
+
// Tool: list_scenarios
|
|
34
|
+
server.registerTool("list_scenarios", {
|
|
35
|
+
title: "List Available Scenarios",
|
|
36
|
+
description: "Returns all available deterministic failure scenarios (F1–F5) with descriptions and audit metrics.",
|
|
37
|
+
inputSchema: ListScenariosSchema,
|
|
38
|
+
}, async () => handleListScenarios());
|
|
39
|
+
// Tool: reset_session
|
|
40
|
+
server.registerTool("reset_session", {
|
|
41
|
+
title: "Reset Session",
|
|
42
|
+
description: "Resets a session's call counter and history without deleting it. Useful for re-running the same scenario.",
|
|
43
|
+
inputSchema: ResetSessionSchema,
|
|
44
|
+
}, async (args) => handleResetSession(args));
|
|
45
|
+
// Tool: delete_session
|
|
46
|
+
server.registerTool("delete_session", {
|
|
47
|
+
title: "Delete Session",
|
|
48
|
+
description: "Permanently deletes a session and its state.",
|
|
49
|
+
inputSchema: DeleteSessionSchema,
|
|
50
|
+
}, async (args) => handleDeleteSession(args));
|
|
51
|
+
return server;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,yBAAyB;QAC/B,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,sBAAsB;IACtB,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,2IAA2I;QAC7I,WAAW,EAAE,kBAAkB;KAChC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CACzC,CAAC;IAEF,qBAAqB;IACrB,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACT,wKAAwK;QAC1K,WAAW,EAAE,iBAAiB;KAC/B,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CACxC,CAAC;IAEF,mBAAmB;IACnB,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACT,yIAAyI;QAC3I,WAAW,EAAE,eAAe;KAC7B,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CACtC,CAAC;IAEF,kBAAkB;IAClB,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACT,+TAA+T;QACjU,WAAW,EAAE,cAAc;KAC5B,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CACrC,CAAC;IAEF,uBAAuB;IACvB,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,0BAA0B;QACjC,WAAW,EACT,oGAAoG;QACtG,WAAW,EAAE,mBAAmB;KACjC,EACD,KAAK,IAAI,EAAE,CAAC,mBAAmB,EAAE,CAClC,CAAC;IAEF,sBAAsB;IACtB,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,2GAA2G;QAC7G,WAAW,EAAE,kBAAkB;KAChC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CACzC,CAAC;IAEF,uBAAuB;IACvB,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,8CAA8C;QAC3D,WAAW,EAAE,mBAAmB;KACjC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAC1C,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
|
|
2
|
+
interface Connectable {
|
|
3
|
+
connect(transport: Transport): Promise<void>;
|
|
4
|
+
}
|
|
5
|
+
export declare function startStdio(server: Connectable): Promise<void>;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=stdio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/server/stdio.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAE/E,UAAU,WAAW;IACnB,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAGnE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/server/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAOjF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAmB;IAClD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
export declare function handleStartSession(args: {
|
|
2
|
+
scenario_id?: string;
|
|
3
|
+
mode?: "deterministic" | "chaos";
|
|
4
|
+
error_rate?: number;
|
|
5
|
+
}): {
|
|
6
|
+
content: {
|
|
7
|
+
type: "text";
|
|
8
|
+
text: string;
|
|
9
|
+
}[];
|
|
10
|
+
isError: boolean;
|
|
11
|
+
} | {
|
|
12
|
+
isError?: undefined;
|
|
13
|
+
content: {
|
|
14
|
+
type: "text";
|
|
15
|
+
text: string;
|
|
16
|
+
}[];
|
|
17
|
+
};
|
|
18
|
+
export declare function handleExecuteCall(args: {
|
|
19
|
+
session_id: string;
|
|
20
|
+
tool_name: string;
|
|
21
|
+
arguments: Record<string, unknown>;
|
|
22
|
+
idempotency_key?: string;
|
|
23
|
+
}): {
|
|
24
|
+
content: {
|
|
25
|
+
type: "text";
|
|
26
|
+
text: string;
|
|
27
|
+
}[];
|
|
28
|
+
isError: boolean;
|
|
29
|
+
};
|
|
30
|
+
export declare function handleGetReport(args: {
|
|
31
|
+
session_id: string;
|
|
32
|
+
format?: "json" | "markdown";
|
|
33
|
+
}): Promise<{
|
|
34
|
+
content: {
|
|
35
|
+
type: "text";
|
|
36
|
+
text: string;
|
|
37
|
+
}[];
|
|
38
|
+
isError: boolean;
|
|
39
|
+
} | {
|
|
40
|
+
isError?: undefined;
|
|
41
|
+
content: {
|
|
42
|
+
type: "text";
|
|
43
|
+
text: string;
|
|
44
|
+
}[];
|
|
45
|
+
}>;
|
|
46
|
+
export declare function handleGetScore(args: {
|
|
47
|
+
session_id: string;
|
|
48
|
+
format?: "json" | "markdown";
|
|
49
|
+
}): {
|
|
50
|
+
content: {
|
|
51
|
+
type: "text";
|
|
52
|
+
text: string;
|
|
53
|
+
}[];
|
|
54
|
+
isError: boolean;
|
|
55
|
+
} | {
|
|
56
|
+
isError?: undefined;
|
|
57
|
+
content: {
|
|
58
|
+
type: "text";
|
|
59
|
+
text: string;
|
|
60
|
+
}[];
|
|
61
|
+
};
|
|
62
|
+
export declare function handleListScenarios(): {
|
|
63
|
+
content: {
|
|
64
|
+
type: "text";
|
|
65
|
+
text: string;
|
|
66
|
+
}[];
|
|
67
|
+
};
|
|
68
|
+
export declare function handleResetSession(args: {
|
|
69
|
+
session_id: string;
|
|
70
|
+
}): {
|
|
71
|
+
content: {
|
|
72
|
+
type: "text";
|
|
73
|
+
text: string;
|
|
74
|
+
}[];
|
|
75
|
+
isError: boolean;
|
|
76
|
+
} | {
|
|
77
|
+
isError?: undefined;
|
|
78
|
+
content: {
|
|
79
|
+
type: "text";
|
|
80
|
+
text: string;
|
|
81
|
+
}[];
|
|
82
|
+
};
|
|
83
|
+
export declare function handleDeleteSession(args: {
|
|
84
|
+
session_id: string;
|
|
85
|
+
}): {
|
|
86
|
+
content: {
|
|
87
|
+
type: "text";
|
|
88
|
+
text: string;
|
|
89
|
+
}[];
|
|
90
|
+
isError: boolean;
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/tools/handlers.ts"],"names":[],"mappings":"AAoEA,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;;cAWiB,MAAM;;;;;;;cAcV,MAAM;;;EAenB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;;cAMe,MAAM;;;;EAkJrB;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;CAC9B;;cAMe,MAAM;;;;;;;cAwBR,MAAM;;;GAKnB;AAKD,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAA;CAAE;;cAMzE,MAAM;;;;;;;cAuBR,MAAM;;;EAKnB;AAED,wBAAgB,mBAAmB;;cAWrB,MAAM;;;EAKnB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE;;cAM/C,MAAM;;;;;;;cAaR,MAAM;;;EAKnB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE;;cAKlD,MAAM;;;;EAQnB"}
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
import { createSession, getSession, incrementCall, addRecord, resetSession as resetSessionState, deleteSession as deleteSessionState, isWriteTool, markGhostCommitted, } from "../core/state-engine.js";
|
|
2
|
+
import { generateReport, formatMarkdown } from "../core/report-generator.js";
|
|
3
|
+
import { computeScore, formatScoreReport } from "../benchmark/score.js";
|
|
4
|
+
import { generatePatches, formatPatchReport } from "../hardening/patch-generator.js";
|
|
5
|
+
import { getScenarioById, ALL_SCENARIOS } from "../scenarios/f1-f5.js";
|
|
6
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
7
|
+
import { dirname } from "node:path";
|
|
8
|
+
const AUDIT_REPORT_PATH = ".cuonztech/audit-report.json";
|
|
9
|
+
// Two calls are the "same request" for dedup purposes only if every argument
|
|
10
|
+
// besides idempotency_key itself also matches — otherwise a reused key with
|
|
11
|
+
// different arguments would silently replay the FIRST call's response while
|
|
12
|
+
// the new, different arguments get recorded in history (inconsistent audit
|
|
13
|
+
// trail, and a real anomaly worth letting through to normal classification
|
|
14
|
+
// instead of masking it as a clean cache hit).
|
|
15
|
+
function sameArgs(a, b) {
|
|
16
|
+
const strip = (o) => {
|
|
17
|
+
const { idempotency_key, ...rest } = o;
|
|
18
|
+
return rest;
|
|
19
|
+
};
|
|
20
|
+
return JSON.stringify(strip(a)) === JSON.stringify(strip(b));
|
|
21
|
+
}
|
|
22
|
+
// Ad-hoc, non-chaos mode only: a key that already committed a successful
|
|
23
|
+
// write must replay that exact result instead of generating a fresh one each
|
|
24
|
+
// time (real idempotency is enforced server-side, not just classified after
|
|
25
|
+
// the fact). Excluded on purpose:
|
|
26
|
+
// - Deterministic scenarios (F1–F5): their trigger conditions are positional
|
|
27
|
+
// (by callNumber) and intentionally decide what a specific call number
|
|
28
|
+
// returns regardless of key reuse (e.g. F2 must still 429 the 2nd call
|
|
29
|
+
// even though it shares a key with the 1st).
|
|
30
|
+
// - Chaos mode: stochastic error_rate injection must keep applying to every
|
|
31
|
+
// call attempt, including retries of a committed key — otherwise a key
|
|
32
|
+
// that happened to commit early becomes permanently immune to chaos for
|
|
33
|
+
// the rest of the session, defeating the configured error_rate.
|
|
34
|
+
function findCommittedResponse(session, key, toolName, callArgs) {
|
|
35
|
+
const tracking = session.keyStates.get(key);
|
|
36
|
+
if (!tracking || tracking.state !== "COMMITTED")
|
|
37
|
+
return null;
|
|
38
|
+
const committed = session.history.filter((r) => r.args["idempotency_key"] === key &&
|
|
39
|
+
r.toolName === toolName &&
|
|
40
|
+
!r.injectedError &&
|
|
41
|
+
!r.response.includes('"error"') &&
|
|
42
|
+
sameArgs(r.args, callArgs));
|
|
43
|
+
return committed.length > 0 ? committed[committed.length - 1] : null;
|
|
44
|
+
}
|
|
45
|
+
export function handleStartSession(args) {
|
|
46
|
+
const scenarioId = args.scenario_id ?? null;
|
|
47
|
+
const mode = args.mode ?? "deterministic";
|
|
48
|
+
const errorRate = args.error_rate ?? 0.0;
|
|
49
|
+
if (scenarioId) {
|
|
50
|
+
const scenario = getScenarioById(scenarioId);
|
|
51
|
+
if (!scenario) {
|
|
52
|
+
return {
|
|
53
|
+
content: [
|
|
54
|
+
{
|
|
55
|
+
type: "text",
|
|
56
|
+
text: `Error: Unknown scenario "${scenarioId}". Valid: F1–F5.`,
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
isError: true,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const session = createSession(scenarioId, mode, errorRate);
|
|
64
|
+
return {
|
|
65
|
+
content: [
|
|
66
|
+
{
|
|
67
|
+
type: "text",
|
|
68
|
+
text: JSON.stringify({
|
|
69
|
+
sessionId: session.sessionId,
|
|
70
|
+
scenarioId: session.scenarioId,
|
|
71
|
+
mode: session.mode,
|
|
72
|
+
errorRate: session.errorRate,
|
|
73
|
+
message: "Session created. Use this sessionId for all subsequent calls.",
|
|
74
|
+
}, null, 2),
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export function handleExecuteCall(args) {
|
|
80
|
+
const session = getSession(args.session_id);
|
|
81
|
+
if (!session) {
|
|
82
|
+
return {
|
|
83
|
+
content: [
|
|
84
|
+
{
|
|
85
|
+
type: "text",
|
|
86
|
+
text: `Error: Session "${args.session_id}" not found.`,
|
|
87
|
+
},
|
|
88
|
+
],
|
|
89
|
+
isError: true,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const callNumber = incrementCall(args.session_id);
|
|
93
|
+
if (args.idempotency_key && !session.scenarioId && session.mode !== "chaos") {
|
|
94
|
+
const cached = findCommittedResponse(session, args.idempotency_key, args.tool_name, args.arguments);
|
|
95
|
+
if (cached) {
|
|
96
|
+
const dedupArgs = { ...args.arguments, idempotency_key: args.idempotency_key };
|
|
97
|
+
const record = {
|
|
98
|
+
callNumber,
|
|
99
|
+
toolName: args.tool_name,
|
|
100
|
+
args: dedupArgs,
|
|
101
|
+
injectedError: null,
|
|
102
|
+
response: cached.response,
|
|
103
|
+
upstreamExecuted: false,
|
|
104
|
+
timestamp: Date.now(),
|
|
105
|
+
deduplicated: true,
|
|
106
|
+
};
|
|
107
|
+
addRecord(args.session_id, record);
|
|
108
|
+
let cachedBody;
|
|
109
|
+
try {
|
|
110
|
+
cachedBody = JSON.parse(cached.response);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
cachedBody = cached.response;
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
content: [
|
|
117
|
+
{
|
|
118
|
+
type: "text",
|
|
119
|
+
text: JSON.stringify({
|
|
120
|
+
callNumber,
|
|
121
|
+
statusCode: 200,
|
|
122
|
+
injectedError: null,
|
|
123
|
+
response: cachedBody,
|
|
124
|
+
deduplicated: true,
|
|
125
|
+
}, null, 2),
|
|
126
|
+
},
|
|
127
|
+
],
|
|
128
|
+
isError: false,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Inject idempotency key into args for tracking
|
|
133
|
+
const mergedArgs = { ...args.arguments };
|
|
134
|
+
if (args.idempotency_key) {
|
|
135
|
+
mergedArgs["idempotency_key"] = args.idempotency_key;
|
|
136
|
+
}
|
|
137
|
+
// Determine if scenario triggers an error
|
|
138
|
+
let injectedError = null;
|
|
139
|
+
let responseBody;
|
|
140
|
+
let statusCode = 200;
|
|
141
|
+
// Ghost-write: the simulated upstream actually executed the write, but the
|
|
142
|
+
// agent only sees a timeout — it must read-before-retry to find out. Mirrors
|
|
143
|
+
// the same classification used by the (unwired) proxy's decideChaosAction,
|
|
144
|
+
// so F1 produces a real GHOST_CAUGHT/GHOST_MISSED instead of a generic retry.
|
|
145
|
+
let isGhostWrite = false;
|
|
146
|
+
if (session.scenarioId) {
|
|
147
|
+
const scenario = getScenarioById(session.scenarioId);
|
|
148
|
+
if (scenario && scenario.triggerCondition(callNumber, args.tool_name)) {
|
|
149
|
+
const resp = scenario.simulatedResponse;
|
|
150
|
+
// Don't mark "success" type as injected error — F4 simulates successful duplicate dispatches
|
|
151
|
+
injectedError = resp.type === "success" ? null : `[${resp.type.toUpperCase()}]`;
|
|
152
|
+
statusCode = resp.statusCode ?? 500;
|
|
153
|
+
responseBody = resp.body;
|
|
154
|
+
isGhostWrite = resp.type === "timeout" && isWriteTool(args.tool_name);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
responseBody = {
|
|
158
|
+
result: "ok",
|
|
159
|
+
callNumber,
|
|
160
|
+
timestamp: new Date().toISOString(),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else if (session.mode === "chaos" && Math.random() < session.errorRate) {
|
|
165
|
+
// Stochastic error injection
|
|
166
|
+
injectedError = "[CHAOS_INJECTED]";
|
|
167
|
+
statusCode = 500;
|
|
168
|
+
responseBody = {
|
|
169
|
+
error: "CHAOS_ERROR",
|
|
170
|
+
message: "Stochastically injected failure.",
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
responseBody = {
|
|
175
|
+
result: "ok",
|
|
176
|
+
callNumber,
|
|
177
|
+
timestamp: new Date().toISOString(),
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
const response = typeof responseBody === "string"
|
|
181
|
+
? responseBody
|
|
182
|
+
: JSON.stringify(responseBody);
|
|
183
|
+
const record = {
|
|
184
|
+
callNumber,
|
|
185
|
+
toolName: args.tool_name,
|
|
186
|
+
args: mergedArgs,
|
|
187
|
+
injectedError,
|
|
188
|
+
response,
|
|
189
|
+
upstreamExecuted: isGhostWrite,
|
|
190
|
+
timestamp: Date.now(),
|
|
191
|
+
};
|
|
192
|
+
addRecord(args.session_id, record);
|
|
193
|
+
if (isGhostWrite && args.idempotency_key) {
|
|
194
|
+
markGhostCommitted(args.session_id, args.idempotency_key);
|
|
195
|
+
}
|
|
196
|
+
return {
|
|
197
|
+
content: [
|
|
198
|
+
{
|
|
199
|
+
type: "text",
|
|
200
|
+
text: JSON.stringify({
|
|
201
|
+
callNumber,
|
|
202
|
+
statusCode,
|
|
203
|
+
injectedError,
|
|
204
|
+
response: responseBody,
|
|
205
|
+
}, null, 2),
|
|
206
|
+
},
|
|
207
|
+
],
|
|
208
|
+
isError: statusCode >= 400,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
export async function handleGetReport(args) {
|
|
212
|
+
const session = getSession(args.session_id);
|
|
213
|
+
if (!session) {
|
|
214
|
+
return {
|
|
215
|
+
content: [
|
|
216
|
+
{
|
|
217
|
+
type: "text",
|
|
218
|
+
text: `Error: Session "${args.session_id}" not found.`,
|
|
219
|
+
},
|
|
220
|
+
],
|
|
221
|
+
isError: true,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
const report = generateReport(session);
|
|
225
|
+
const format = args.format ?? "markdown";
|
|
226
|
+
// Persist JSON report atomically
|
|
227
|
+
try {
|
|
228
|
+
await mkdir(dirname(AUDIT_REPORT_PATH), { recursive: true });
|
|
229
|
+
await writeFile(AUDIT_REPORT_PATH, JSON.stringify(report, null, 2), "utf-8");
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
// Non-fatal: report still returned in chat
|
|
233
|
+
}
|
|
234
|
+
const output = format === "json" ? JSON.stringify(report, null, 2) : formatMarkdown(report);
|
|
235
|
+
return {
|
|
236
|
+
content: [
|
|
237
|
+
{
|
|
238
|
+
type: "text",
|
|
239
|
+
text: output,
|
|
240
|
+
},
|
|
241
|
+
],
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
// Resilience Score + Hardening Patches for THIS session's own audit report —
|
|
245
|
+
// unlike `benchmark` mode (which scores a hardcoded scripted call sequence
|
|
246
|
+
// against itself), this scores whatever the connected agent actually did.
|
|
247
|
+
export function handleGetScore(args) {
|
|
248
|
+
const session = getSession(args.session_id);
|
|
249
|
+
if (!session) {
|
|
250
|
+
return {
|
|
251
|
+
content: [
|
|
252
|
+
{
|
|
253
|
+
type: "text",
|
|
254
|
+
text: `Error: Session "${args.session_id}" not found.`,
|
|
255
|
+
},
|
|
256
|
+
],
|
|
257
|
+
isError: true,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
const report = generateReport(session);
|
|
261
|
+
const score = computeScore([report]);
|
|
262
|
+
const patches = generatePatches([report], score);
|
|
263
|
+
const format = args.format ?? "markdown";
|
|
264
|
+
const output = format === "json"
|
|
265
|
+
? JSON.stringify({ score, patches }, null, 2)
|
|
266
|
+
: [formatScoreReport(score), patches.length > 0 ? formatPatchReport(patches) : null]
|
|
267
|
+
.filter(Boolean)
|
|
268
|
+
.join("\n\n");
|
|
269
|
+
return {
|
|
270
|
+
content: [
|
|
271
|
+
{
|
|
272
|
+
type: "text",
|
|
273
|
+
text: output,
|
|
274
|
+
},
|
|
275
|
+
],
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
export function handleListScenarios() {
|
|
279
|
+
const list = ALL_SCENARIOS.map((s) => ({
|
|
280
|
+
id: s.id,
|
|
281
|
+
name: s.name,
|
|
282
|
+
description: s.description,
|
|
283
|
+
auditMetric: s.auditMetric,
|
|
284
|
+
}));
|
|
285
|
+
return {
|
|
286
|
+
content: [
|
|
287
|
+
{
|
|
288
|
+
type: "text",
|
|
289
|
+
text: JSON.stringify(list, null, 2),
|
|
290
|
+
},
|
|
291
|
+
],
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
export function handleResetSession(args) {
|
|
295
|
+
const session = getSession(args.session_id);
|
|
296
|
+
if (!session) {
|
|
297
|
+
return {
|
|
298
|
+
content: [
|
|
299
|
+
{
|
|
300
|
+
type: "text",
|
|
301
|
+
text: `Error: Session "${args.session_id}" not found.`,
|
|
302
|
+
},
|
|
303
|
+
],
|
|
304
|
+
isError: true,
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
resetSessionState(args.session_id);
|
|
308
|
+
return {
|
|
309
|
+
content: [
|
|
310
|
+
{
|
|
311
|
+
type: "text",
|
|
312
|
+
text: `Session "${args.session_id}" reset. Call counter and history cleared.`,
|
|
313
|
+
},
|
|
314
|
+
],
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
export function handleDeleteSession(args) {
|
|
318
|
+
const deleted = deleteSessionState(args.session_id);
|
|
319
|
+
return {
|
|
320
|
+
content: [
|
|
321
|
+
{
|
|
322
|
+
type: "text",
|
|
323
|
+
text: deleted
|
|
324
|
+
? `Session "${args.session_id}" deleted.`
|
|
325
|
+
: `Session "${args.session_id}" not found.`,
|
|
326
|
+
},
|
|
327
|
+
],
|
|
328
|
+
isError: !deleted,
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
//# sourceMappingURL=handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/tools/handlers.ts"],"names":[],"mappings":"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"}
|