@spilno/herald-mcp 1.28.2 → 1.30.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.
@@ -0,0 +1,90 @@
1
+ /**
2
+ * CEDA-65: Sanitization Tests
3
+ */
4
+ import { sanitize, previewSanitization, DataClassification, SensitiveDataType } from "./sanitization.js";
5
+ describe("sanitization", () => {
6
+ describe("sanitize", () => {
7
+ it("should pass through clean text unchanged", () => {
8
+ const result = sanitize("This is a clean pattern about error handling");
9
+ expect(result.sanitizedText).toBe("This is a clean pattern about error handling");
10
+ expect(result.redactionCount).toBe(0);
11
+ expect(result.dataClass).toBe(DataClassification.PUBLIC);
12
+ });
13
+ it("should redact API keys", () => {
14
+ const result = sanitize("Found issue with api_key=sk-proj-abc123xyz789abc123xyz789");
15
+ expect(result.sanitizedText).toContain("[API_KEY_REDACTED]");
16
+ expect(result.detectedTypes).toContain(SensitiveDataType.API_KEY);
17
+ expect(result.dataClass).toBe(DataClassification.CONFIDENTIAL);
18
+ });
19
+ it("should redact Stripe-style keys", () => {
20
+ const result = sanitize("Using sk-live-abc123xyz789abc123xyz789abc");
21
+ expect(result.sanitizedText).toContain("[API_KEY_REDACTED]");
22
+ });
23
+ it("should redact JWT tokens", () => {
24
+ const result = sanitize("Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U");
25
+ expect(result.sanitizedText).toContain("[JWT_TOKEN_REDACTED]");
26
+ });
27
+ it("should redact file paths with usernames", () => {
28
+ const result = sanitize("Error in /Users/john/project/src/auth.ts");
29
+ expect(result.sanitizedText).toContain("[PATH_REDACTED]");
30
+ expect(result.detectedTypes).toContain(SensitiveDataType.FILE_PATH);
31
+ });
32
+ it("should redact email addresses", () => {
33
+ const result = sanitize("Contact user at john.doe@company.com for help");
34
+ expect(result.sanitizedText).toContain("[EMAIL_REDACTED]");
35
+ });
36
+ it("should redact phone numbers", () => {
37
+ const result = sanitize("Call support at 555-123-4567");
38
+ expect(result.sanitizedText).toContain("[PHONE_REDACTED]");
39
+ });
40
+ it("should redact IP addresses", () => {
41
+ const result = sanitize("Server at 192.168.1.100 is down");
42
+ expect(result.sanitizedText).toContain("[IP_REDACTED]");
43
+ });
44
+ it("should block private keys entirely", () => {
45
+ const result = sanitize(`-----BEGIN PRIVATE KEY-----
46
+ MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC7
47
+ -----END PRIVATE KEY-----`);
48
+ expect(result.blocked).toBe(true);
49
+ expect(result.sanitizedText).toBe("");
50
+ expect(result.detectedTypes).toContain(SensitiveDataType.PRIVATE_KEY);
51
+ });
52
+ it("should block AWS access keys", () => {
53
+ const result = sanitize("Using AKIAIOSFODNN7EXAMPLE for S3");
54
+ expect(result.blocked).toBe(true);
55
+ expect(result.detectedTypes).toContain(SensitiveDataType.AWS_KEY);
56
+ });
57
+ it("should redact passwords", () => {
58
+ const result = sanitize("Set password=mysecretpass123");
59
+ expect(result.sanitizedText).toContain("[PASSWORD_REDACTED]");
60
+ });
61
+ it("should redact SSN patterns", () => {
62
+ const result = sanitize("SSN: 123-45-6789");
63
+ expect(result.sanitizedText).toContain("[SSN_REDACTED]");
64
+ });
65
+ it("should handle multiple redactions", () => {
66
+ const result = sanitize("User john@test.com at 192.168.1.1 with api_key=abc123xyz789abc123xyz789");
67
+ expect(result.redactionCount).toBeGreaterThan(2);
68
+ expect(result.sanitizedText).not.toContain("john@test.com");
69
+ expect(result.sanitizedText).not.toContain("192.168.1.1");
70
+ });
71
+ });
72
+ describe("previewSanitization", () => {
73
+ it("should show original and sanitized side by side", () => {
74
+ const result = previewSanitization("Contact john@example.com");
75
+ expect(result.original).toBe("Contact john@example.com");
76
+ expect(result.sanitized).toContain("[EMAIL_REDACTED]");
77
+ expect(result.wouldSanitize).toBe(true);
78
+ });
79
+ it("should indicate clean content", () => {
80
+ const result = previewSanitization("Clean pattern description");
81
+ expect(result.wouldSanitize).toBe(false);
82
+ expect(result.classification).toBe(DataClassification.PUBLIC);
83
+ });
84
+ it("should indicate blocked content", () => {
85
+ const result = previewSanitization("Key: AKIAIOSFODNN7EXAMPLE");
86
+ expect(result.wouldBlock).toBe(true);
87
+ });
88
+ });
89
+ });
90
+ //# sourceMappingURL=sanitization.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitization.spec.js","sourceRoot":"","sources":["../src/sanitization.spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spilno/herald-mcp",
3
- "version": "1.28.2",
3
+ "version": "1.30.0",
4
4
  "description": "Herald MCP - AI-native interface to CEDA (Cognitive Event-Driven Architecture)",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -28,7 +28,7 @@
28
28
  "license": "MIT",
29
29
  "repository": {
30
30
  "type": "git",
31
- "url": "https://github.com/Spilno-me/ceda.git",
31
+ "url": "git+https://github.com/Spilno-me/ceda.git",
32
32
  "directory": "herald-mcp"
33
33
  },
34
34
  "homepage": "https://getceda.com",